読者です 読者をやめる 読者になる 読者になる

Golangで言語処理100本ノック2015 第4章: 形態素解析

言語処理100本ノック 2015の第4章: 形態素解析の10問です。

前処理

mecabの処理は先に済ませておきます。

# mecab neko.txt -o neko.txt.mecab

30. 形態素解析結果の読み込み

形態素解析結果(neko.txt.mecab)を読み込むプログラムを実装せよ.ただし,各形態素は表層形(surface),基本形(base),品詞(pos),品詞細分類1(pos1)をキーとするマッピング型に格納し,1文を形態素マッピング型)のリストとして表現せよ.第4章の残りの問題では,ここで作ったプログラムを活用せよ.

gistc6be3f30935d9f1032cb8dd29b3a6f8e

# go run q30.go
[map[base:  pos:記号 pos1:空白 surface: ] map[pos:名詞 pos1:代名詞 surface:吾輩 base:吾輩] map[pos1:係助詞 surface:は base:は pos:助詞] map[base:猫 pos:名詞 pos1:一般 surface:猫] map[pos:助動詞 pos1:* surface:で base:だ] map[pos1:* surface:ある base:ある pos:助動詞] map[surface:。 base:。 pos:記号 pos1:句点]]

mecabの結果は形態素ごとに一行で出力されるのでReadLine()で読み取っています。 例として「 吾輩は猫である。」を表示させています。

31. 動詞

動詞の表層形をすべて抽出せよ.

gist0230b9eddcac1d6541935856342866ba

# go run q31.go
[生れ つか し] [死な 得 られ]

Q30をそのまま利用すれば余裕です。結果が長くなるので最初と最後の3つだけ標準出力させました。

32. 動詞の原形

動詞の原形をすべて抽出せよ.

gist015db5a66878a77df992821b075ab8b5

# go run q32.go
[生れる つく する] [死ぬ 得る られる]

Q31とほぼ同じです。

33. サ変名詞

サ変接続の名詞をすべて抽出せよ.

gistc2c9fe26605d803583db6ee4b26f6f00

# go run q33.go
[見当 記憶 話] [抵抗 見当 判然]

こちらもQ31とほぼ同じです。

34. 「AのB」

2つの名詞が「の」で連結されている名詞句を抽出せよ.

gist120cb467e3a271b9bfbd55af9ca1b868

$ go run q34.go
[彼の掌 掌の上 書生の顔] [水の中 座敷の上 不可思議の太平]

「の」が出てきた前後が名詞になるものを抜き出しています。 気をつけるのはindex out of rangeのruntime errorを出さないことでしょうか。

35. 名詞の連接

名詞の連接(連続して出現する名詞)を最長一致で抽出せよ.

gistf15b4cadbae765b94f4abf99b771ae39

# go run q35.go
[吾輩 猫 名前] [太平 太平 南無阿弥陀仏南無阿弥陀仏]

名詞が続く間はループ回しています。 標準出力させながらコード書いてましたが、意外なもの(非自立や接尾の名詞)が出力され、間違っているのでは?と微妙にハマりました。そもそも国語力というか日本語の弱さが問題です。。。

36. 単語の出現頻度

文章中に出現する単語とその出現頻度を求め,出現頻度の高い順に並べよ.

gistc5f254f78da7fd7774c6513726607a71

# go run q36.go
の 9194
。 7486
て 6848
、 6772
は 6420
に 6243
を 6071
だ 5975
と 5508
が 5337

mapは順序を保存してくれないので、擬似的なTreeMapとしてsortedMap型を用意しました。ほぼこちらを参考にしました。
上位10個を抜き出してみましたが、固有名詞がないですね。。。

37. 頻度上位10語

出現頻度が高い10語とその出現頻度をグラフ(例えば棒グラフなど)で表示せよ.

gist5f74bc0a182cfa616d5f270037ac4d17

実行結果

f:id:cipepser:20170325103521p:plain

gonum/plotが日本語サポートしていないのでX軸にどの単語だが、表示されないのが微妙ですね。。。出力しているのはQ36と同じですが。 棒グラフの書き方は以前記事にまとめました。

38. ヒストグラム

単語の出現頻度のヒストグラム(横軸に出現頻度,縦軸に出現頻度をとる単語の種類数を棒グラフで表したもの)を描け.

gistc2bdc1b97162a49e390991bd454d45c5

実行結果

f:id:cipepser:20170325125720p:plain

英語だとちゃんと軸名が表示されます笑 題意の単語が何を指しているのか戸惑って、問題文理解するのに時間掛かりました。。。

39. Zipfの法則

単語の出現頻度順位を横軸,その出現頻度を縦軸として,両対数グラフをプロットせよ.

gista037ce443bd2066f6061ce91a8167630

実行結果

f:id:cipepser:20170325172053p:plain

Q38を流用するとすぐですね。

感想

言語処理をやったことがなかったので、そもそもの用語を知らなくて戸惑うことが多かったです。このまま5章の係り受け解析も頑張ります。

いつも通りコードはGithubにも置いてあります。

Reference