Skip to content

Latest commit

 

History

History
333 lines (300 loc) · 13.1 KB

tokens.md

File metadata and controls

333 lines (300 loc) · 13.1 KB

tokens

tokensは文書を語に分割した状態で効率的に処理するquantedaの独自オブジェクト。tokensの作成・操作を行う関数はtokens_*と命名されている。トークン化(tokenization)とは、自然言語を機械が扱える形に変換する処理を指す。

作成

tokens()ICUに内蔵された辞書に基づき、日本語(および中国語)のトークン化を行うたため、MecabやChasenなどの形態素解析ツールを必要としない。テキストがあらかじめ半角スペースで分かち書きされている場合は、what = "fastestword"とする。

require(quanteda) # パッケージの読み込み
# 分かち書きされている場合
load('data/data_corpus_asahi_2016_seg.rda') # Mecabで分かち書き済み
toks <- tokens(data_corpus_asahi_2016_seg, what = "fastestword", remove_punct = FALSE)

# 分かち書きされていない場合
load('data/data_corpus_asahi_2016.rda') 
toks <- tokens(data_corpus_asahi_2016, remove_punct = FALSE)

quantedaMecabを呼び出す関数を含んでいないが、RMeCabを用いると容易にMecabによる分かち書きを行える

操作

tokensは語の位置を保持するためpadding = TRUEとすると、削除した語が空文字となり、元々の語の距離を維持することができる。

# 文字以外を削除
toks <- tokens_select(toks, '^[0-9ぁ-んァ-ヶー一-龠]+$', valuetype = 'regex', padding = TRUE)
# ひらがなを削除
toks <- tokens_remove(toks, '^[ぁ-ん]+$', valuetype = 'regex', padding = TRUE)

# KWICで用例を確認
head(kwic(toks, "トランプ"), 20)
##                                                   
##    [text12, 357]          放言 続ける | トランプ |
##    [text13, 420]       党 トップ 走る | トランプ |
##    [text13, 490]                 右翼 | トランプ |
##    [text68, 342]     実業 家 ドナルド | トランプ |
##    [text68, 438]          逆に 上がる | トランプ |
##    [text68, 481]              影響 大 | トランプ |
##    [text303, 53]            不動産 王 | トランプ |
##   [text303, 106]         不信 感 強い | トランプ |
##   [text303, 136]                      | トランプ |
##   [text303, 224]                 過ぎ | トランプ |
##   [text303, 255]                   叫 | トランプ |
##   [text303, 296]            大 隔たる | トランプ |
##  [text337, 1059]         候補 座 争う | トランプ |
##   [text376, 578]   首位 走る ドナルド | トランプ |
##    [text431, 50] 人気 集める ドナルド | トランプ |
##   [text431, 105]         訴え 国際 面 | トランプ |
##   [text431, 438]            爆撃 主張 | トランプ |
##   [text443, 342]       党 大統領 候補 | トランプ |
##   [text443, 417]              強 批判 | トランプ |
##    [text444, 61]   首位 走る ドナルド | トランプ |
##                           
##  氏 人気 衰え             
##  氏 メキシコ 移民         
##  氏 敵                    
##  氏 支持 率               
##  氏 当選 可能性           
##  氏 に関する 話題 大統領  
##  氏 優位 立               
##  氏 心理                  
##  人気                     
##  人気 衰え 見             
##  氏 有力                  
##  流 ポピュリズム 大衆 迎合
##  氏 イスラム教 徒         
##  氏 イスラム教 徒         
##  氏 排外 主義 的          
##  氏 批判 随所             
##  氏 イスラム教 徒         
##  氏 イスラム教 徒         
##  氏 排外 主義             
##  氏 暗 批判
# KWICをより見やすく別のウィンドウで表示
View(head(kwic(toks, "トランプ"), 100))
# Nグラムの生成
toks_ngram <- tokens_ngrams(toks, n = 2)
head(toks_ngram[[1]], 20)
##  [1] "衆_院"     "院_議員"   "残り_3"   "3_年"     "年_近く"  
##  [6] "安倍_晋"   "晋_三"     "三_首相"   "衆_参"     "参_同日"  
## [11] "同日_選"   "衆_院"     "院_解散"   "憲法_改正" "含む_今夏"
## [16] "今夏_以降" "政権_運営" "同日_選"   "続く_三つ" "判断_材料"

分析

辞書分析

# 地理的辞書の読み込み (Watanabe 2017)
dict <- dictionary(file = 'extra/watanabe_country.yml')
head(dict['ASIA'])
## Dictionary object with 1 primary key entry and 3 nested levels.
## - [ASIA]:
##   - [CENTER]:
##     - [KZ]:
##       - カザフスタン*, カザフ*, アスタナ
##     - [KG]:
##       - キルギスタン*, キルギス*, ビシュケク
##     - [TJ]:
##       - タジキスタン*, タジック*, ドゥシャンベ
##     - [TM]:
##       - トルクメニスタン*, トルクメン*, アシャバード
##     - [UZ]:
##       - ウズベキスタン*, ウズベク*, タシケント
##   - [EAST]:
##     - [CN]:
##       - 中華人民共和国*, 中国*, 北京, 上海
##     - [TW]:
##       - 中華民国*, 台湾*, 台北
##     - [HK]:
##       - 香港*
##     - [MO]:
##       - マカオ*
##     - [KP]:
##       - 朝鮮民主主義人民共和国*, 北朝鮮*, 平壌
##     - [JP]:
##       - 日本*, 東京
##     - [MN]:
##       - モンゴル*, ウランバートル
##     - [KR]:
##       - 大韓民国*, 韓国, ソウル
##   - [SOUTH]:
##     - [AF]:
##       - アフガニスタン*, アフガン, カブール
##     - [BD]:
##       - バングラデシュ*, ダッカ
##     - [BT]:
##       - ブータン*, ティンプー
##     - [IN]:
##       - インド*, ムンバイ, ニューデリー
##     - [IR]:
##       - イラン*, テヘラン
##     - [MV]:
##       - モルディブ*
##     - [NP]:
##       - ネパール*, カトマンズ
##     - [PK]:
##       - パキスタン*, イスラマバード
##     - [LK]:
##       - スリランカ*, コロンボ
##   - [SOUTH-EAST]:
##     - [BN]:
##       - ブルネイ*
##     - [KH]:
##       - カンボジア*, プノンペン
##     - [ID]:
##       - インドネシア*, ジャカルタ
##     - [LA]:
##       - ラオス*, ビエンチャン
##     - [MY]:
##       - マレーシア*, クアラルンプール, プトラジャヤ
##     - [MM]:
##       - ミャンマー*, ビルマ*, ヤンゴン, ナイピドー
##     - [PH]:
##       - フィリピン*, マニラ
##     - [SG]:
##       - シンガポール*
##     - [TH]:
##       - タイ*, バンコク
##     - [TL]:
##       - 東ティモール*, ディリ
##     - [VN]:
##       - ベトナム*, ハノイ, ホーチミン市
##   - [WEST]:
##     - [AM]:
##       - アルメニア*, イェレヴァン
##     - [AZ]:
##       - アゼルバイジャン*, アゼリ*, バクー
##     - [BH]:
##       - バーレーン*, マナマ
##     - [CY]:
##       - キプロス*, ニコシア
##     - [GE]:
##       - グルジア*, トビリシ
##     - [IQ]:
##       - イラク*, バグダッド
##     - [IL]:
##       - イスラエル*, エルサレム
##     - [JO]:
##       - ヨルダン*, アンマン
##     - [KW]:
##       - クウェート*, クウェートシティ
##     - [LB]:
##       - レバノン*, ベイルート
##     - [PS]:
##       - パレスチナ*, ガザ市, ガザ, ウェストバンク
##     - [OM]:
##       - オマーン*, マスカット
##     - [QA]:
##       - カタール*, ドーハ
##     - [SA]:
##       - サウジアラビア*, リヤド
##     - [SY]:
##       - シリア*, ダマスカス
##     - [TR]:
##       - トルコ*, アンカラ, イスタンブール
##     - [AE]:
##       - アラブ首長国連邦*, ドバイ, アブダビ
##     - [YE]:
##       - イエメン*, サナア
# 国コードでtokensを作成
toks_country <- tokens_lookup(toks, dict, levels = 3) 
head(toks_country)
## tokens from 6 documents.
## text1 :
## [1] "TH" "TH" "JP"
## 
## text2 :
##  [1] "KR" "KR" "KR" "JP" "KR" "KR" "KR" "JP" "KR" "KR"
## 
## text3 :
##  [1] "HK" "JP" "JP" "HK" "JP" "JP" "JP" "JP" "JP" "JP" "JP" "JP" "JP" "JP"
## [15] "JP" "JP" "JP"
## 
## text4 :
##  [1] "US" "US" "JP" "CN" "CN" "US" "US" "CN" "CN" "CN" "US" "JP" "CN" "CN"
## [15] "US" "CN" "CN" "JP" "VN" "US" "US" "US" "QA" "US" "US" "US" "CN" "US"
## 
## text5 :
## [1] "CN" "CN" "CN"
## 
## text6 :
##  [1] "KR" "KR" "KR" "JP" "KR" "KR" "KR" "KR" "KR" "JP" "JP" "KR"
# 集計
mx_country <- dfm(toks_country)
county_top <- topfeatures(mx_country)
barplot(county_top)

共起語分析

連続的共起語を分析する際は、どのような種類の語の連続を抽出するのかを考慮し、句読点を削除する際も語の間の距離が維持されている必要がある。このために、上記の例では、tokens()においてremove_punct = FALSEとし、tokens_remove()おいてはpadding = TRUEとしてある。

# 連続的共起語の抽出
seqs <- textstat_collocations(toks, method = 'lambda', min_count = 10)
head(seqs, 20)
##    collocation count count_nested length   lambda        z
## 1        2 0 17664            0      2 3.912125 414.8268
## 2        0 0 12074            0      2 3.431085 321.9955
## 3        1 0 14115            0      2 3.159691 321.7225
## 4        万 円  4310            0      2 6.860684 299.2863
## 5        1 9  9438            0      2 3.633802 291.9676
## 6    写真 説明  5692            0      2 9.107553 285.1837
## 7      参院 選  5316            0      2 8.256177 284.7346
## 8        自 民  4034            0      2 9.096058 268.3871
## 9      委員 会  4185            0      2 7.568652 258.9181
## 10     選挙 区  2849            0      2 6.039747 247.8189
## 11       1 8  7347            0      2 3.319673 245.2910
## 12       米 軍  2702            0      2 7.137082 243.9430
## 13       億 円  2639            0      2 7.021595 235.3968
## 14   安全 保障  2435            0      2 8.846559 233.4832
## 15   安倍 政権  2158            0      2 6.816112 232.3488
## 16       0 年  5774            0      2 3.343906 225.7959
## 17       5 年  4781            0      2 3.648890 224.6263
## 18     関係 者  2696            0      2 5.509666 224.2081
## 19       1 5  7185            0      2 2.879554 218.7052
## 20       4 年  4404            0      2 3.612114 214.7963
# 共起語の結合
toks_comp <- tokens_compound(toks, seqs[seqs$z > 3,], concatenator = '') # p<0.001 の有意水準で共起語を選択

head(kwic(toks, "トランプ*", window = 10)) # 結合前
##                                                               
##  [text12, 357]              入国 禁止 放言 続ける | トランプ |
##  [text13, 420]      大統領 選 共和 党 トップ 走る | トランプ |
##  [text13, 490]                        過激派 右翼 | トランプ |
##  [text68, 342]  政治 経験 乏しい 実業 家 ドナルド | トランプ |
##  [text68, 438]            支持 下がる 逆に 上がる | トランプ |
##  [text68, 481]                            影響 大 | トランプ |
##                                   
##  氏 人気 衰え 分断 分断           
##  氏 メキシコ 移民 イスラム教 徒 敵
##  氏 敵 戦                         
##  氏 支持 率 首位 走る             
##  氏 当選 可能性 高い              
##  氏 に関する 話題 大統領 選 乗 取
head(kwic(toks_comp, "トランプ*", window = 10)) # 結合後
##                                                                 
##  [text12, 331]  イスラム教徒 入国禁止 放言 続ける | トランプ氏 |
##  [text13, 384] 注目 米大統領選 共和党 トップ 走る | トランプ氏 |
##  [text13, 451]                        過激派 右翼 | トランプ氏 |
##  [text68, 297] 縫 政治経験 乏しい 実業家 ドナルド | トランプ氏 |
##  [text68, 388]            支持 下がる 逆に 上がる | トランプ氏 |
##  [text68, 429]                            影響 大 | トランプ氏 |
##                                
##   人気 衰え 分断 分断          
##   メキシコ 移民 イスラム教徒 敵
##   敵 戦                        
##   支持率 首位 走る 手法        
##   当選 可能性 高い             
##  に関する 話題 大統領選 乗 取