情報学部大学生のダラダラ日記

β日記

機械学習や日記っぽいものを書きます

言語処理100本ノック2020 第4章 Pythonでの解答例

スポンサーリンク

前章↓↓

parco1021.hatenablog.com

 

第4章 形態素解析

まず、与えられたneko.txtをMeCabを使って形態素解析します。MeCabの導入等は別途調べてみてください。形態素解析するコマンドは以下の通りです。

mecab neko.txt --output neko.txt.macab

 

30.形態素解析結果の読み込み(31日目|9月4日)

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

まず、各行をタブ(\t)区切りで分割します。文末文字(EOS)のみである行があるため、それを除くために分割した長さが2である場合にのみ適用します。分割した後の方を次は','区切りで分割し、それぞれ求められたキーとマッピングします。

 

31.動詞(32日目|9月5日)

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

30で作成した辞書型のデータを使います。まず、動詞の重複等が考えられるのでset()を用いて重複する要素を除きます。

 

32.動詞の原形(33日目|9月6日)

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

31と同様です。

 

33.「AのB」(34日目|9月7日)

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

"名詞"+”の”+"名詞"となっている場所を探します。

 

34.名詞の連接(35日目|9月8日)

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

現在参照している品詞が名詞ならばtempに追加し、次の文字を参照する。次の文字も名詞ならば再度tempに追加する。tempの長さが2以上つまり名詞が2連続以上続いているならばそれを出力します。

 

35.単語の出現頻度(36日目|9月9日)

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

単語と出現回数を対応させたdictを作成します。そのままカウントを開始すると','や'。'をカウントしてしまうため、posが記号のものはdictへ格納しないようにします。未登録の単語が来た場合、新たにdictへ登録し、その後登録未登録に関わらずインクリメントします。

 

36.頻度上位10語(37日目|9月10日)

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

35で出現頻度順にしたデータが用意されたのでそれを使います。棒グラフにする際、横軸のラベルを単語にします。それが当然日本語であり、そのままグラフにすると日本語は豆腐になってしまうため専用のライブラリ?をインストールします。pip install japanize_matplotlibを実行してから動かしましょう。

f:id:Parco1021:20200910221438p:plain

 

37.「猫」と共起頻度の高い上位10語(38日目|9月11日)

「猫」とよく共起する(共起頻度が高い)10語とその出現頻度をグラフ(例えば棒グラフなど)で表示せよ.

今回、何をどうするかが具体的に問題文で示されていません。自分で何を"よく共起する"か定義する必要があります。僕は"猫"の前後5単語の記号と助詞、及び助動詞を除いた品詞をそれとし、カウントしました。

 

f:id:Parco1021:20200911194504p:plain


 

38.ヒストグラム(39日目|9月12日)

単語の出現頻度のヒストグラムを描け.ただし,横軸は出現頻度を表し,1から単語の出現頻度の最大値までの線形目盛とする.縦軸はx軸で示される出現頻度となった単語の異なり数(種類数)である.

35のデータをヒストグラムにするだけで特に難しいことはないです。

f:id:Parco1021:20200912203730p:plain

 

39.Zipfの法則(40日目|9月13日)

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

対数グラフはそれぞれのスケールをlogにすればよいのでplt.x(y)scale('log')とします。余談ですが、Zipf(ジップ)の法則は、ある膨大なテキストの要素を出現頻度順にしたとき、その順位と頻度を乗算すると定数になる法則です。つまり今回は縦軸に出現頻度、横軸に順位としているためプロットしたグラフは1次関数のような形になることが期待されます。

f:id:Parco1021:20200913214349p:plain

 以上で4章は終わりです。お疲れ様でした。

スポンサーリンク