スペル修正プログラムの作り方 #pronama
-
Upload
hiroyoshi-komatsu -
Category
Documents
-
view
4.085 -
download
2
Transcript of スペル修正プログラムの作り方 #pronama
スペル修正プログラムの作り方とろとき(@torotoki)
スペル修正プログラムの作り方
自己紹介
・名前は とろとき
・言語は Python/Perl/Java
・Android とか自然言語処理、 機械学習などを勉強中。
・中学生
(@torotki)
はじめに
{自然言語処理|プロ生}初心者です 色々とおかしなところがあればご指摘ください
スペルチェッカの実装はかなり簡単 - 今回作成したコードは約180行(Python)
- 内、50行はデータベースに単語を突っ込むため
- 理論さえ分かればとっても簡単!
はじめに
・自然言語処理について
・コンピュータでテキストを”分析”させる試み
・Microsoftの選ぶ、10年後テクノロジー分野でホットな職業!
・The Top Three hottest new majors for a career in technology “Data Mining/Machine Learning/AI/Natural Language Processing” (データマイニング/機械学習/人工知能/自然言語処理) “Business Intel l igence/Competit ive Intel l igence” (ビジネスインテリジェンス/競合調査)
“Analyt ics/S tat ist ics” (分析/統計)
←コレ
Microsoft JobsBlog より引用http:// jobsblog.com/blog/top- three -new- tech-m ajor s/
おおまかにやること
・単語の辞書を用意(数十万~数百万)
・受け取った文字が辞書にあるか(=誤字かどうか)
・無い場合、受け取った文字を辞書と比較
- ここが大変
・もっとも適切な候補を出力
辞書選び
何種類も無料で配布されてる 単語だけが必要なので、基本的にどれでもOK 主要なものはこの三つ
IPA-dic
NAIST-dic
UniDic
単語数は NAIST-dic < UniDic < IPA-dic
・今回はIPA-dicを使用(MeCabに付属していたせい)
1/4 単語の辞書を用意
1/4 単語の辞書を用意
辞書の中身(IPA-dicの場合)
きらびやか,1287,1287,8349,名詞,形容動詞語幹,* ,* , * , * ,きらびやか,キラビヤカ,キラビヤカ
史的,1287,1287,6608,名詞,形容動詞語幹,* ,* , * , * ,史的,シテキ,シテキ
プラトニック,1287,1287,5077,名詞,形容動詞語幹,* ,* , * , * ,プラトニック,プラトニック,. . (略)
てらてら,1287,1287,8349,名詞,形容動詞語幹,* ,* , * , * ,てらてら,テラテラ,テラテラ
静謐静謐,1287,1287,4845,名詞,形容動詞語幹,* ,* , * , * ,静謐,セイヒツ,セイヒツ
今回はここしか使わない
2/4 受け取った文字が辞書にあるか
・さっきの単語辞書と受け取った文字を照合 ・合っていたら(=誤字じゃなければ)そのまま出力
・合っていなければ、誤字扱いで次の段階へ
3/4 誤字を辞書と比較
辞書に正解の文字があると仮定正解を書こうとして誤字する確率の誤りモデルを計算
辞書
Microsoft
Yahoo
.. . . .
Mycrosoft
3/4 誤字を辞書と比較
誤りモデルを数値で出すために、編集距離を求める
・編集距離とは
入力文字列に最低何回の編集操作をすれば 正解が求まるかという数値。
1つの文字に対して ・挿入 ・削除 ・置き換え ・転置 を繰り返す
3/4 誤字を辞書と比較
編集距離の例
誤字 単語
・挿入: スペルミッス → スペルミス・削除: スペミス → スペルミス・置換: スプルミス → スペルミス・転置: スペミルス → スペルミス
3/4 誤字を辞書と比較
編集距離を使えば、簡単に誤字を探せる!
3/4 誤字を辞書と比較
はずもなく
3/4 誤字を辞書と比較
・問題点 漢字が多すぎて実用的じゃない(アルファベットだけなら大丈夫)
毎回20万語と比較しなきゃいけない
3文字の比較量は1回の編集距離だけで
{(5,000*4)+3+(5,000*3)+3}*200,000 = 7,001,200,000回
3/4 誤字を辞書と比較
・じゃあどうするの?
前もって候補を絞る = N-gram で修正候補の絞り込み
3/4 誤字を辞書と比較
・N-gram で修正候補の絞り込み N-gramって?
文字をN個ずつ切り出すという意味 自然言語処理にいろいろと使われてる。
とろとき = [とろ][ろと][とき]
Nの個数で名前が変わる 1文字 ・・・ ユニグラム [と][ろ][と][き]
2文字 ・・・ バイグラム [とろ][ろと][とき]
3文字 ・・・ トリグラム [とろと][ろとろ][とき]
単純にN-gramといえば基本的にバイグラム(2文字ずつ)
・例外にもれず今回はバイグラムを使用
次官, 政治次官, 次官補, 事務次官
3/4 誤字を辞書と比較
・N-gram で修正候補の絞り込み どうやって絞り込むの? 辞書から全単語のN-gramインデックスを作る
いう
ごり
次官
あいうち, あっという間, ねらいうち, . .
にごり酒, おごり, 名ごり, ごりごり, . .
3/4 誤字を辞書と比較
・N-gram で修正候補の絞り込み どうやって絞り込むの? 入力 “データベaス” → デー + ータ + タベ + ベa + aス N-gramインデックスで複数回ヒットするもの
参考: http:/ /www.slideshare.net/naoya1977/spell-correction
‘デー’ : "データテレホン" , "データセット" , "データタブレット", "データベース "
‘ータ’ : "インバータ" , "データベース " , "オータックス" , "ポータブル" ,
‘タベ’ : "ベタベタ" , "データベース " , "ヌタベット" , "カンタベリー" ,
‘ベa’ : . . .
‘ aス ’ : . . .
3/4 誤字を辞書と比較
・編集距離にも工夫 N-gramを使って候補を減らす(4つに絞ったと仮定)ことで 比較量を { (5,000*4)+3+(5,000*3)+3}*200,000 = 7,001,200,000回 から {(5,000*4)+3+(5,000*3)+3}*4 = 140,024回 にまで減らすことができた。
・ただしこれは編集距離が1回までの話 (smthing → something) などができていない 編集距離を少しでも多く出すためには?
3/4 誤字を辞書と比較
・編集距離にも工夫
挿入 削除 置換 転置 { (5,000*4)+3+(5,000*3)+3}*4 = 140,024回
編集距離の計算で回数を多くしているのは
5,000*4(挿入) と 5,000*3(置き換え) の式 ※ 5,000 は漢字及びひらがなとカタカナの数
2回目以降に編集距離を求めるときは、 挿入 置き換え の作業を消せばよいのでは?
3/4 誤字を辞書と比較
・編集距離にも工夫 2回目以降は 挿入 と 置換 を求めないことで
({(5,000*4)+3+(5,000*3)+3} * 4 * {(3+3)*4} = 3,360,576回
と編集距離2もギリギリ求められるくらいにできる (ただしやってみたところ4~6秒の時間がかかった)
言語を変える、並列化する、などして高速化の必要あり?
3/4 誤字を辞書と比較
・編集距離が同じ場合の対処 goolに対して編集距離が1
goa l / goo / good / . . .
スペルミスの80~95%は編集距離が1らしい[要出典]
・文章の出現頻度が高い語ほど正解に近いとする(DF) goodの頻度が高い → goodが正解と推測 でもgoalが正解でもおかしくないじゃん!
3/4 誤字を辞書と比較
・短い単語は求めにくい gool はスペルミスだけど、「good」が正解とはいいにくい 実は結構難しい問題 ・そもそも短い語に対しては Google すらできてない
「もしかして」が出てない図
3/4 誤字を辞書と比較
・短い単語は求めにくい ・応急策(その1)
Improved Error Model(ちょっとだけ取り入れ)
単語の先頭は誤りにくいよね? ・先頭、中間、最後の3値で計算
・ただし、まだ gool→good の問題は解決できない。 むしろ悪化
3/4 誤字を辞書と比較
・応急策その2 置換操作の文字によって優先順位をつける
- 「a」と「n」は間違えにくい
- 「p」と「o」は間違えやすい
- これだとgool→good問題は解決できそうだけど・・・。
- 当然、漢字は不可
3/4 誤字を辞書と比較
・応急策その2A spe ll ing Correction p rog ram based on anoisy channe l model(M. Kernighan1990)
3/4 誤字を辞書と比較
・まとめ ・まず誤字かどうか判別 ・N-gramで候補を絞る ・絞った候補と入力文字の編集距離を計算 - 候補が被ったら最も一般的な語を使う ・最も数値の高かった候補を出す
3/4 誤字を辞書と比較
・デモ
豆知識的な応用事例
・ N-gram N-gramによる誤字候補の絞り
- 類似文字の索引にも使える
- コピペ論文を検出する論文まであった
剽窃レポート発見に利用する1文単位での検索クエリ作成手法 http: //ci.nii. ac . jp/naid/110007467248
豆知識的な応用事例
・EM-based Error Model
EM-based Er ror Model ・検索エンジンからスペルミスを機械学習 ・あまり詳しくない ・引用すると
・(検索エンジンの)クエリログからクエリの訂正を行う ・誤りと正解のペアデータは必要ない ・クエリログは10~15%のスペルミスを 含むので、ここから学習
引用: スペル訂正エンジンについてのサーベイ #TokyoNLPhttp : / /www.sl ideshare .net/nokuno/tokyonlp05-spe ll-correction
ご清聴ありがとうございました。
参考文献
・「入門自然言語処理」
オライリージャパン 2010年11月発行 , 592ページ
・スペル修正プログラムはどう書くか http: //bit . ly/c3BHf
・スペルミス修正プログラムを作ろう http: //sl idesha . re/qghImL
・スペル訂正エンジンのサーベイ・スペル訂正エンジンのサーベイ http: //sl idesha . re/g7SImR