ページへ戻る

− Links

 印刷 

自然言語解析​/頻度解析用の異表記辞書を作る のソース :: NJF Wiki

xpwiki:自然言語解析/頻度解析用の異表記辞書を作るのソース

« Prev[3]  
*異表記辞書の必要性 [#z86db63c]

Mecabの形態素解析の結果を使い、外食の口コミに対して頻度解析を行い人気メニューを割だそうとしたときに、異表記(または表記ゆれ)が問題となりました。

例えば居酒屋で解析すると、同じメニューでも口コミによって異なる書き方をしているため、集計結果がかなり大きく変わってしまいます。特に気になったのが「焼鳥」で、これには以下の異表記があります。

-焼鳥
-ヤキトリ
-やきとり
-焼き鳥
-焼きとり

どの書き方もそれなりに使われているため、これを一つにまとめるかそうでないかで集計結果がかなり変わります。

他には魚や動物の名前を漢字、ひらがな、カタカナで書いたり(例:サンマ、さんま、秋刀魚)する例も、どれもよく使うので結果に影響します。

異表記については日々新語が生まれていたり、複合的な言葉をどうするか、専門用語はどうするかなど、こだわりだすときりがなく、最終的には解析する文書や使い方にあわせて、現状ではある程度人の手をつかうことになりそうです。

とはいえせめて基本的な単語ぐらいはあらかじめまとめておきたい物です。

そこでネットで公開されている表記ゆれ辞書「[[たんし:http://tansi.osdn.jp/]]」を使って基本的な異表記辞書を作ることにします。

*「たんし」とは [#ie705830]

「たんし」はBSDライセンスで公開されている表記ゆれ辞書です。国立国語研究所の表記統合辞書に基づいて、2009年にver1.1が公開され、2016年11月現在までそのままです。ちょっと古いですが、研究者でもない一般の人がすぐにダウンロードできるものが他に見当たりませんでした。とはいえ30万字近くの表記揺れが登録されているので、例えば前述の「焼鳥」や動物の名前などの基本的なところはほぼあります。

データはタブ区切りのテキストになっていて、各フィールドの定義は以下のとおりです。
-見出し語
-読み
-発音
-品詞
-活用形
-同語と判断された「見出し語」のリスト

全て「NAIST Japanese Dictionary」を元にしているそうです。

例えば「すばらしい」という語を検索すると以下の項目が見つかります。

 素晴しい	スバラシイ	スバラシイ	形容詞-自立	形容詞・イ段形容詞・イ段-基本形	素晴しい/素晴らしい/すばらしい
 素晴らしい	スバラシイ	スバラシイ	形容詞-自立	形容詞・イ段形容詞・イ段-基本形	素晴らしい/素晴しい/すばらしい
 すばらしい	スバラシイ	スバラシイ	形容詞-自立	形容詞・イ段形容詞・イ段-基本形	すばらしい/素晴しい/素晴らしい

活用はいらないような気もしますが、送り仮名などに揺れがある可能性を考慮しているのかも知れません。または活用によって同じ品詞でも異なる語が同じ読みになるのかも知れません。実例は見つかりませんでした。

読みと発音は例えば「ええと」は読みは「エエト」ですが、発音は「エート」という風に、読み仮名をふるときと発音は異なることがあるので分けてあるようです。同一語かどうかは読みより発音を基準にしているようです。

品詞については、例えば「くじら」を検索すると、直観的に予想するのは動物の「くじら」です。

 鯨	クジラ	クジラ	名詞-一般		鯨/クジラ/くじら
 クジラ	クジラ	クジラ	名詞-一般		クジラ/鯨/くじら
 くじら	クジラ	クジラ	名詞-一般		くじら/鯨/クジラ

しかし、穴を開けるという意味の「抉る(くじる)」の未然形もあり得ます。

 抉ら	クジラ	クジラ	動詞-自立	五段・ラ行五段・ラ行-未然形	抉ら/くじら
 くじら	クジラ	クジラ	動詞-自立	五段・ラ行五段・ラ行-未然形	くじら/抉ら

このようなこともあるので、品詞も重要です。

データの順番の仕様はわかりませんが、品詞や活用ごとに同じと見なされる単語が固まっているのは確かなようです。

*頻度解析用の異表記辞書を作る方針 [#s98f6a4c]

頻度解析用の異表記辞書を作るには、どの語とどの語を完全に同一と見なせるかを調べなければなりません。例えば「ヤキトリ」を検索すると、

 焼鳥	ヤキトリ	ヤキトリ	名詞-一般		焼鳥/ヤキトリ/やきとり/焼き鳥/焼きとり
 ヤキトリ	ヤキトリ	ヤキトリ	名詞-一般		ヤキトリ/焼鳥/やきとり/焼き鳥/焼きとり
 やきとり	ヤキトリ	ヤキトリ	名詞-一般		やきとり/焼鳥/ヤキトリ/焼き鳥/焼きとり
 焼き鳥	ヤキトリ	ヤキトリ	名詞-一般		焼き鳥/焼鳥/ヤキトリ/やきとり/焼きとり
 焼きとり	ヤキトリ	ヤキトリ	名詞-一般		焼きとり/焼鳥/ヤキトリ/やきとり/焼き鳥

となっています。この場合、全ての語は入れ替え可能なので簡単です。

次に「カリ」という名詞を探してみます。

 猟	カリ	カリ	名詞-一般		猟/カリ
 狩	カリ	カリ	名詞-一般		狩/狩り/カリ
 雁	カリ	カリ	名詞-一般		雁/カリ
 狩り	カリ	カリ	名詞-一般		狩り/狩/カリ
 苅	カリ	カリ	名詞-一般		苅/カリ
 カリ	カリ	カリ	名詞-一般		カリ/猟/狩/雁/狩り/苅/加里/仮り/刈/仮/鴈/借り
 加里	カリ	カリ	名詞-一般		加里/カリ
 仮り	カリ	カリ	名詞-一般		仮り/カリ/仮
 刈	カリ	カリ	名詞-一般		刈/カリ
 仮	カリ	カリ	名詞-一般		仮/カリ/仮り
 鴈	カリ	カリ	名詞-一般		鴈/カリ
 借り	カリ	カリ	名詞-一般		借り/カリ

このうち「狩り」と「狩」、「借り」と「借」は入れ替え可能です。「カリ」は全ての語と入れ替え可能ですが、どの語に入れ替えるか不明であったり、またはもとがどの語かわからなくなってしまうので頻度解析でその入れ替えは使えません。

このことから、頻度解析で同一と見なせる語は最後のフィールド、「同語と判断された「見出し語」のリスト」が順番を除いて同一であることが必要とわかります。また品詞や活用も同一であることも必要です。

*実際に辞書を作る [#qfc22e45]

上記の方針に従って実際に辞書を作るのは簡単で、ファイルを行ごとに上から読み込み、発音が切り替わるタイミングで辞書オブジェクトを作ります。(以下の説明ではpythonを用います)

 data = {}

キーとして最後のリストをソートして再び結合した物を使います。

 key = u'/'.join(sorted(yureList.split(u'/')))

見出し語をこの辞書オブジェクトに追加していきます。

 if key in datas:
     datas[key].append(midashi)
 else:
     datas[key] = [midashi]

こうすると同じ見出しのリストを持つ物がまとまるので、発音が切り替わるタイミングで好きな形で出力してしまえば良いでしょう。

« Prev[3]