Upload
yuichiro-kobayashi
View
22.731
Download
12
Embed Size (px)
Citation preview
Rによるテキストマイニング
小林 雄一郎
(日本学術振興会)
KG.R #2
2012年6月16日(土)、関西学院大学
1
自己紹介
• 小林 雄一郎 (こばやし ゆういちろう)
– 言語学と言語処理と言語教育の挟間をふらふら
– 最近の研究テーマは、「パターン認識と自然言語処理の技術を用い
た習熟度判定」など
2
パターン認識技術を用いた英作文の自動評価
レベル別英作文の自動分類 レベル判定に寄与する要因の特定
* 6月23日(土)電子情報通信学会思考と言語研究会@早稲田大学で発表
3
シャアシャアシャアシャア
ザビ家ザビ家ザビ家ザビ家
ザビ家ザビ家ザビ家ザビ家
(妾腹)(妾腹)(妾腹)(妾腹)
両軍の間に両軍の間に両軍の間に両軍の間に
二人の女性二人の女性二人の女性二人の女性
ララァララァララァララァ
『機動戦士ガンダム』のネットワーク分析
4
ブライトブライトブライトブライト アムロアムロアムロアムロ
ホワイトベースホワイトベースホワイトベースホワイトベース
二人の女性二人の女性二人の女性二人の女性セイラセイラセイラセイラ
ジオン軍
vs.
連邦軍
* 変数は、発話内の人名
Agenda
• テキストマイニングとは
• Rでテキストマイニングをするには?
– 形態素解析
– 頻度表の作成
– N-gramの抽出
– コロケーションの抽出– コロケーションの抽出
• テキストマイニングの実例
– 芥川龍之介と太宰治の著者推定
– クラスター分析
– 判別分析
– サポートベクターマシン
• テキストマイニングを行う際の注意点
5
テキストマイニングとは
• テキストマイニング(text mining)は、テキストを対象としたデータマイニングのことである。通常の文章からなるデータを
単語や文節で区切り、それらの出現の頻度や共出現の相関、
出現傾向、時系列などを解析することで有用な情報を取り出
す、テキストデータの分析方法である。
• テキストデータの多くは形式が定まっておらず、また日本語
は英語などと比べて単語の境界判別の必要性(→わかち書き)や文法ゆらぎが大きい点において形態素解析が困難でき)や文法ゆらぎが大きい点において形態素解析が困難で
あったが、自然言語処理の発展により実用的な水準の分析
が可能となった。テキストマイニングの対象としては、顧客か
らのアンケートの回答やコールセンターに寄せられる質問や
意見、電子掲示板やメーリングリストに蓄積されたテキスト
データなどがある。
http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0
6
テキストマイニングの手順
データ構築データ構築データ構築データ構築 テキスト処理テキスト処理テキスト処理テキスト処理 統計処理統計処理統計処理統計処理 質的分析質的分析質的分析質的分析
7
テキスト収集
電子化
etc.
語彙表の作成
用例の抽出
etc.
検定
多変量解析
etc.
結果の解釈
実質科学的な考察
etc.
• シェイクスピアは誰か
– シェイクスピアの人となりについてはほとんど何も知られていない
– シェイクスピア別人説の根拠
– シェイクスピアの個人史には所々大きな空白部分がある
– シェイクスピア自身によって書かれた手紙が存在しない
– 詳細に書かれたシェイクスピアの遺言書が現存するが、そこには本– 詳細に書かれたシェイクスピアの遺言書が現存するが、そこには本
や戯曲や詩、その他いかなる書き物についても言及されていない
– 自分の芸術に関する持論を1つも著していない
– 署名が4通りもあり、どれ1つとして似た書体ではない
8
◆村上征勝 (2004). 『シェイクスピアは誰ですか?―計量文献学の世界』 東京: 文春新書.
◆「シェイクスピア別人説」(融合のときをもとめて・・・)
http://blogs.yahoo.co.jp/igproj_fusion/archive/2011/03/01
• 「シェイクスピア=ベーコン」説
– 1890年頃、アメリカの物理学者メンデンホール(T. C. Mendenhall)は
「シェイクスピア=ベーコン説」批判を展開
– シェイクスピアの文章の40万語、ベーコンの文章の20万語を比較
– シェイクスピアが4文字の単語を最も多く使用しているのに対し、ベー
コンは3文字の単語を最も多く使用していることを発見
9
http://blogs.yahoo.co.jp/igproj_fu
sion/archive/2011/03/01
– 1975年、メンデンホールの結論を再考させる研究が、ウイリアムズ(C.
B. Williams)によって発表
– 英国の詩人・政治家・軍人だったシドニー(Philip Sidney)の著作を調
べ、同一人物の著作でも散文(prose)と韻文(verse)では、最も多く使
われている単語の長さの値が異なる場合があることを提示
– 「シェイクスピアとは誰か」は、未解決のまま
10
http://blogs.yahoo.co.jp/igproj_fu
sion/archive/2011/03/01
• 読点に注目した著者推定
– 他の言語に比べて、日本語は読点の位置に関する厳密なルールが
ないため、そこに文章の書き手の癖が表れるのではないか
– 中島敦、三島由紀夫、谷崎潤一郎、井上靖の作品を読点の位置で分
類
11◆金明哲 (1996). 「読点から現代作家のクセを検証する」 『統計数理』44(1), 121-125.
• 一人三人作家
– 昭和初期の流行作家である長谷川海太郎は、林不忘、谷譲次、牧
逸馬の3つのペンネームで作品を書き、それぞれ文体を変えたと言わ
れている
– 長谷川(林、谷、牧)、中島、三島、井上の作品を読点の位置で分類
すると。。。
12
• その他の研究(主に、著者推定)
– プラトンの『第七書簡』は贋作か
– 南北戦争の体験談『Q. C. レター』はマーク・トウェインの著作か
– ショーロホフの『静かなるドン』は盗作か
– 『紅楼夢』は1人の作家が書いたものか
– 『旧約聖書』の「イザヤ記」の著者は誰か–
– 『源氏物語』の著者は、本当に紫式部か
– 日蓮遺文の著者は、本当に日蓮か
– 英国内閣を攻撃した投書『ジュニアス・レター』は誰が書いたか
– パトリシア・ハースト誘拐事件の声明文は誰が書いたか
(詳しくは、前掲の村上 2004などを参照)
– これら著者推定の技術は、ジャンル判別、言語能力測定、スパム判
別、ゲノム解析など、様々な分野に応用
13
Rでテキストマイニングをするには?
• パッケージ
– languageR
– tm
– corpora
– RMeCab
• 参考文献
– Stefan Th. Gries (2009). Quantitative Corpus Linguistics with R. New
York: Routledge.
– R. H. Baayen (2008). Analyzing Linguistic Data: A Practical Introduction
to Statistics Using R. Cambridge: Cambridge University Press.
– 石田基広 (2008). 『Rによるテキストマイニング入門』森北出版.
– 金明哲 (2009). 『テキストデータの統計科学入門』岩波書店.
14
今回使うパッケージとデータ
• RMeCab
– 徳島大学の石田基広先生が開発
– Rで、MeCab(現Googleの工藤拓氏が開発)を使った形態素解析
– さらに、MeCabにはないテキスト処理機能多数
– http://rmecab.jp/wiki/index.php?RMeCab%B5%A1%C7%BD
• 使用データ
– 芥川龍之介の『羅生門』
– その他(後述)
(青空文庫からダウンロードし、註とルビを手作業で削除)
15
RMeCab
• インストール方法は、公式ウェブサイトを参照
• 最近のバージョンでは環境設定なども不要
16
形態素解析(直接入力)
> library(RMeCab)
> result1 <- RMeCabC("すもももももももものうち")
> unlist(result1)
名詞 助詞 名詞 助詞 名詞 助詞 名詞
"すもも" "も" "もも" "も" "もも" "の" "うち"
17
【形態素解析】
言語学では、意味を担う最小の言語要素を形態素 (morpheme) と
呼ぶ。これに対応して自然言語処理では、形態素を同定する処理、
すなわち、入力文中の単語を同定し、その語形変化を解析する処理
を形態素解析 (morphological analysis) と呼ぶ。
松本裕治ほか (1997). 『単語と辞書』岩波書店.
> #第二引数 1 を加えると形態素原型を返す
> result2 <- RMeCabC("前回の韓国料理は、おいしかった", 1)
> unlist(result2)
名詞 助詞 名詞 名詞 助詞 記号 形容詞 助動詞
"前回" "の" "韓国" "料理" "は" "、“ "おいしい" "た"
>
> # 名詞だけを抽出したいとき
> unlist(result2)[names(unlist(result2)) == "名詞"]「韓国料理」は
18
> unlist(result2)[names(unlist(result2)) == "名詞"]
名詞 名詞 名詞
"前回" "韓国" "料理"
> # 形容詞だけを抽出したいとき
> unlist(result2)[names(unlist(result2)) == "形容詞"]
形容詞
"おいしい"
> # 助詞だけを抽出したいとき
> unlist(result2)[names(unlist(result2)) == "助詞"]
助詞 助詞
"の" "は"
「韓国料理」は
1語か2語か?
形態素解析(ファイルの読み込み)
> # 形態素解析(ファイルの読み込み)
> result3 <- RMeCabText("A_rashomon.txt")
file = A_rashomon.txt
> result3[1:3]
[[1]]
[1] "羅生門" "名詞" "固有名詞" "一般" "*"
[6] "*" "*" "羅生門" "ラショウモン" "ラショーモン"
19
[[2]]
[1] "芥川" "名詞" "固有名詞" "人名" "姓" "*"
[7] "*" "芥川" "アクタガワ" "アクタガワ"
[[3]]
[1] "龍之介" "名詞" "固有名詞" "人名" "名"
[6] "*" "*" "龍之介" "リュウノスケ" "リューノスケ“
> # 延べ語数
> length(RMeCabText("A_rashomon.txt"))
file = A_rashomon.txt
[1] 3892
頻度表の作成
> # 頻度表の作成
> (result4 <- RMeCabFreq("A_rashomon.txt"))
file = A_rashomon.txt
length = 844
Term Info1 Info2 Freq
1 いや感動詞 * 1
2 々 記号 一般 1
3 ―― 記号 一般 4デフォルトでは、
20
3 ―― 記号 一般 4
4 | 記号 一般 1
5 ※ 記号 一般 3
6 「 記号 括弧開 15
7 」 記号 括弧閉 15
8 。 記号 句点 152
9 記号 空白 29
10 、 記号 読点 385
> # 異なり語数
> nrow(result4)
[1] 844
デフォルトでは、
文字コード順に表示
> #頻度順でリストを返す
> Freqlist <- data.frame(Freq = result4$Freq, Term = result4$Term, Info1 =
result4$Info1, Info2 = result4$Info2)
> Freqlist[rev(order(Freqlist$Freq, Freqlist$Term, Freqlist$Info1, Freqlist$Info2)),]
Freq Term Info1 Info2
10 385 、 記号 読点
94 181 の 助詞 連体化
57 155 を 助詞 格助詞
一番左の列にある数字は、
ソートする前の行数
21
57 155 を 助詞 格助詞
8 152 。 記号 句点
100 144 た助動詞 *
67 129 て 助詞 接続助詞
50 113 に 助詞 格助詞
59 110 は 助詞 係助詞
101 82 だ助動詞 *
44 80 が 助詞 格助詞
148 66 する 動詞 自立
323 53 いる 動詞 非自立
463 44 下人 名詞 一般
(省略)
ソートする前の行数
N-gramの抽出
• (例文)今日ぼくは学校に行った。
【N-gram】
言語の特徴を示すものとして、2文字、3文字が隣接して生じる文
字の共起関係(これを2グラム、3グラム、一般にNグラムという)の頻
度を調べることが行われる。
長尾真ほか (2004). 『言語情報処理』岩波書店.
• (例文)今日ぼくは学校に行った。
↓ (2-gramを抽出)
「今日-ぼく」、「ぼく-は」、「は-学校」、「学校-に」、「に-行っ」、
「行っ-た」、「た-。」
22
# N-gram
> target <- "A_rashomon.txt"
> (result5 <- Ngram(target, type = 0, N = 2)) # 文字2-gram
file = A_rashomon.txt Ngram = 2
length = 2448
Ngram Freq
1 [S-e] 1
2 [a-l] 1
引数typeで、文字n-gram、単語n-gram、
品詞n-gramを指定
23
2 [a-l] 1
3 [e-n] 2
(省略)
> (result5 <- Ngram(target, type = 1, N = 2)) # 単語2-gram
file = A_rashomon.txt Ngram = 2
length = 953
Ngram Freq
1 [Sentimentalisme-影響] 1
2 [あかい-時] 1
3 [いい-の] 1
(省略)
品詞n-gramを指定
引数Nで、n-gramのnを指定
頻度順にするときは、
やはり自分でソート
> (result5 <- Ngram(target, type = 2, N = 2)) # 品詞2-gram
file = A_rashomon.txt Ngram = 2
length = 67
Ngram Freq
1 [感動詞-記号] 1
2 [記号-感動詞] 1
3 [記号-記号] 47
(省略)
24
(省略)
コロケーションの抽出
> # コロケーション
> (result6 <- collocate(file = target, node = "老婆", span=3))
file = A_rashomon.txt
length = 792
Term Before After Span Total
1 4 0 4 29
2 、 16 9 25 385
3 。 10 1 11 152
25
3 。 10 1 11 152
4 」 2 0 2 15
5 ある 4 1 5 56
(省略)
70 [[MORPHEMS]] 28 41 69 792
71 [[TOKENS]] 112 84 196 3892
【コロケーション】
コロケーションとは、語と語の間における、語彙、意味、文法等に
関する習慣的な共起関係を言う。
堀正広 (2009). 『英語コロケーション研究入門』研究社.
> #TスコアとMIスコアを求める
> target <- "A_rashomon.txt"
> result7 <- collocate(file = target, node = "老婆", span = 3)
file = A_rashomon.txt
length = 792
> collScores(result7, "老婆", span = 3)
Term Before After Span Total T MI
1 4 0 4 29 1.37410072 1.67599758
ごくごく簡単に言うと、
Tスコアは高頻度語を
重視し、
26
1 4 0 4 29 1.37410072 1.67599758
2 、 16 9 25 385 1.67625899 0.58912013
3 。 10 1 11 152 1.33836331 0.74548268
4 」 2 0 2 15 0.95637464 1.62708798
5 ある 4 1 5 56 1.15503367 1.04855174
(省略)
70 [[MORPHEMS]] 28 41 69 792 NA NA
71 [[TOKENS]] 112 84 196 3892 NA NA
重視し、
MIスコアは低頻度語
を重視
• Tスコア
– 平均値の差の検定量に基づく
– 2語の共起が偶然の確率を超えて有意なものかどうか
T = (実測値の平均-期待値の平均)÷分散
総数√
• 相互情報量 (MI)
– 事象Aを知ることで、事象Bに関する曖昧さ(エントロピー)がどの程度
減少するか
– ある語が共起相手の語の情報をどの程度持っているのか
27
I = log2
共起頻度×コーパス語数
中心語頻度×共起語頻度
√
テキストマイニングの実例
• 芥川龍之介(1892-1927)と太宰治(1909-1948)による文学作
品の著者推定
• 分析データ
芥川龍之介 太宰治
アグニの神 グッド・バイ
28
アグニの神 グッド・バイ
一夕話 走れメロス
邪宗門 狂言の神
河童 虚構の春
奇怪な再会 お伽草紙
羅生門 パンドラの匣
杜子春 猿面冠者
馬の脚 斜陽
海のほとり 姥捨
藪の中 ヴィヨンの妻
• 目的変数
– 「芥川」、「太宰」
• 説明変数
– 16種類の文字と読点の共起頻度(「か,」,「が,」,「く,」,「し,」,
「ず,」,「て,」,「で,」,「と,」,「に,」,「は,」,「ば,」,「へ,」,「も,」,「ず,」,「て,」,「で,」,「と,」,「に,」,「は,」,「ば,」,「へ,」,「も,」,
「ら,」,「り,」,「れ,」)
– 個々のテキストの総語数が異なるため,1000語あたりの相対頻度に
変換
– 複数のテキストからN-gram頻度行列を作成するには、RMeCabの
docNgram() 関数を使用
– 詳細は割愛(石田 2008を参照)
29
か, が, く, し, ず, て, で, と, に, は, ば, へ, も, ら, り, れ, 作者A_アグニの神 1.39 4.67 0.25 0.88 0.51 1.64 0.25 3.28 4.80 5.69 1.01 0.88 2.27 4.67 1.39 0.00 芥川A_一夕話 0.51 3.23 0.00 0.85 0.34 0.00 0.68 2.55 4.60 6.30 2.04 0.51 2.89 3.57 1.70 0.00 芥川A_邪宗門 0.83 7.51 0.83 0.45 0.30 7.23 2.76 4.75 3.09 6.25 0.48 0.35 3.09 4.90 0.93 0.20 芥川A_河童 0.78 1.27 0.14 0.59 0.19 0.11 0.03 1.11 0.35 0.35 1.22 0.03 0.73 2.89 1.51 0.11 芥川A_奇怪な再会 0.97 6.48 0.05 0.00 0.48 0.77 0.05 4.21 5.95 5.86 0.29 1.74 2.76 5.86 1.06 0.00 芥川A_羅生門 0.71 5.48 0.88 0.53 0.35 8.48 3.71 3.53 4.59 13.07 1.41 0.00 1.77 6.01 1.06 0.18 芥川A_杜子春 0.99 5.06 0.44 0.33 0.66 8.14 0.88 4.40 3.63 4.18 0.88 0.99 3.63 7.37 0.66 0.00 芥川A_馬の脚 1.28 2.11 0.18 0.27 0.27 0.09 0.00 1.01 0.46 0.09 1.47 0.00 0.64 1.83 1.47 0.09 芥川
30
A_馬の脚 1.28 2.11 0.18 0.27 0.27 0.09 0.00 1.01 0.46 0.09 1.47 0.00 0.64 1.83 1.47 0.09 芥川A_海のほとり 0.17 1.34 0.00 1.01 0.84 0.34 0.00 1.17 0.84 0.17 0.17 0.00 1.17 2.18 1.68 0.50 芥川A_藪の中 1.31 4.29 0.00 0.12 0.12 0.12 0.00 3.10 7.74 7.27 1.67 1.55 3.22 3.57 1.91 0.24 芥川D_グッド・バイ 0.00 2.53 1.09 2.87 0.55 7.37 3.55 1.57 2.53 10.45 0.55 0.14 4.03 4.51 1.78 0.48 太宰D_走れメロス 0.00 2.14 0.51 1.43 0.51 5.11 1.74 1.33 2.14 13.38 0.82 0.00 2.96 2.55 1.63 0.51 太宰D_狂言の神 0.00 0.26 1.49 1.49 0.97 7.97 2.01 1.30 3.63 7.38 0.84 0.19 2.20 1.88 2.40 1.04 太宰D_虚構の春 1.05 3.06 1.36 1.45 0.66 5.56 2.46 1.36 1.85 6.46 0.70 0.11 2.77 2.18 1.67 0.40 太宰D_お伽草紙 0.00 2.95 1.12 2.27 0.57 6.67 2.05 1.37 2.36 8.25 0.49 0.25 4.29 2.67 1.41 0.58 太宰D_パンドラの匣 1.31 3.99 1.06 1.47 0.57 8.03 2.46 1.71 2.92 8.86 0.30 0.07 3.74 2.89 1.44 0.31 太宰D_猿面冠者 0.62 1.98 0.07 1.50 0.41 4.31 1.09 0.55 1.98 9.37 0.62 0.21 2.26 2.94 1.03 0.41 太宰D_斜陽 0.99 3.50 1.13 1.26 0.55 10.39 3.53 2.37 3.30 9.48 0.46 0.10 5.08 4.30 1.59 0.36 太宰D_姥捨 1.24 2.62 0.51 1.38 0.51 8.79 2.25 1.53 1.82 14.31 0.73 0.00 3.85 3.34 2.47 0.73 太宰D_ヴィヨンの妻 1.33 3.75 1.68 1.87 0.35 10.31 4.24 2.17 2.66 6.71 0.54 0.05 3.90 3.21 1.63 0.20 太宰
> # データの読み込み
> dat <- read.delim(“Akutagawa-Dazai.txt”, row.names = 1, header = T)
> # データの概要
> summary(dat)
か が く し
Min. :0.0000 Min. :0.2591 Min. :0.0000 Min. :0.0000
1st Qu.:0.4249 1st Qu.:2.1349 1st Qu.:0.1184 1st Qu.:0.5104
Median :0.8982 Median :3.1491 Median :0.5096 Median :1.1333
31
Median :0.8982 Median :3.1491 Median :0.5096 Median :1.1333
Mean :0.7731 Mean :3.4112 Mean :0.6387 Mean :1.1022
3rd Qu.:1.2471 3rd Qu.:4.3845 3rd Qu.:1.0984 3rd Qu.:1.4771
Max. :1.3898 Max. :7.5073 Max. :1.6768 Max. :2.8679
(省略)
作者
芥川龍之介:10
太宰治 :10
> # クラスター分析(ユークリッド距離,最長一致法)
> result <- hclust(dist(dat[, -17]), “complete”)
> # 結果の表示
> result
Call:
hclust(d = dist(dat[, -17]), method = "complete")
Cluster method : complete
32
Cluster method : complete
Distance : euclidean
Number of objects : 20
>
> # デンドログラムの描画
> plot (result, hang = -1)
左側に太宰クラスター、
右側に芥川クラスター
(唯一の例外は
『羅生門』)
33
> # 線形判別分析(+交差妥当化)
> library(MASS)
> lda.model.cv <- lda(作者 ~ ., data = dat, CV = T)
> (lda.tab2 <- table(dat[, 17], lda.model.cv$class))
芥川 9 1
太宰 2 8
>
> # 正判別率の計算
6番目(『羅生門』)と13番目
(『狂言の神』)と17番目(『猿
34
> # 正判別率の計算
> sum(diag(lda.tab2)) / sum(lda.tab2)
[1] 0.85
>
> # どれが誤判別されているのか?
> lda.model.cv$class
[1] 芥川龍之介芥川龍之介芥川龍之介芥川龍之介芥川龍之介太宰治
[7] 芥川龍之介芥川龍之介芥川龍之介芥川龍之介太宰治 太宰治
[13] 芥川龍之介太宰治 太宰治 太宰治 芥川龍之介太宰治
[19] 太宰治 太宰治
Levels: 芥川龍之介太宰治
面冠者』)が誤判別されている
> # サポートベクターマシン(SVM)
> library(e1071)
> #同じ結果を出すために,疑似乱数の種の設定
> set.seed(5)
> svm.model <- svm(作者 ~ ., data = dat, cross = 5)
> summary(svm.model)
Call:
svm(formula = 作者 ~ ., data = dat, cross = 5)
35
svm(formula = 作者 ~ ., data = dat, cross = 5)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 1
gamma: 0.0625
Number of Support Vectors: 18
( 10 8 )
Number of Classes: 2
Levels:
芥川太宰
5-fold cross-validation on training data:
Total Accuracy: 100
36
Total Accuracy: 100
Single Accuracies:
100 100 100 100 100
>
> # 正判別率の計算
> (svm.tab <- table(dat[, 17], svm.model$fitted))
芥川 太宰
芥川 10 0
太宰 0 10
> sum(diag(svm.tab)) / sum(svm.tab)
[1] 1
正判別率100% !!
テキストマイニングを行う際の注意点
• データや目的にあった手法を使う
– 必ずしも統計の数理的原理を理解する必要はないが、「こういうとき
にはこの手法を使う」、あるいは「こういうときにこの手法を使ってはい
けない」という最低限の知識は必要
• できるだけシンプルな手法で解く
– 無理に高度な手法を使う必要はない
– 「何で解くか」ではなく、「何を解くか」
• 統計は万能ではない
– 統計を使ったからといって、「新しいこと」が分かるとは限らない
– 統計的な有意差が言語学的な有意差を意味するとは限らない
– 一番大切なものは、データを正しく解釈する能力
37