スペル修正プログラムの作り方 #pronama

32
スペル修正プログラムの作り方 とろとき(@torotoki)

Transcript of スペル修正プログラムの作り方 #pronama

Page 1: スペル修正プログラムの作り方 #pronama

スペル修正プログラムの作り方とろとき(@torotoki)

スペル修正プログラムの作り方

Page 2: スペル修正プログラムの作り方 #pronama

自己紹介

・名前は とろとき

・言語は Python/Perl/Java

・Android とか自然言語処理、 機械学習などを勉強中。

・中学生

(@torotki)

Page 3: スペル修正プログラムの作り方 #pronama

はじめに

{自然言語処理|プロ生}初心者です 色々とおかしなところがあればご指摘ください

スペルチェッカの実装はかなり簡単 - 今回作成したコードは約180行(Python)

- 内、50行はデータベースに単語を突っ込むため

- 理論さえ分かればとっても簡単!

Page 4: スペル修正プログラムの作り方 #pronama

はじめに

・自然言語処理について

・コンピュータでテキストを”分析”させる試み

・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/

Page 5: スペル修正プログラムの作り方 #pronama

おおまかにやること

・単語の辞書を用意(数十万~数百万)

・受け取った文字が辞書にあるか(=誤字かどうか)

・無い場合、受け取った文字を辞書と比較

- ここが大変

・もっとも適切な候補を出力

Page 6: スペル修正プログラムの作り方 #pronama

辞書選び

何種類も無料で配布されてる 単語だけが必要なので、基本的にどれでもOK 主要なものはこの三つ

IPA-dic

NAIST-dic

UniDic

単語数は NAIST-dic < UniDic < IPA-dic

・今回はIPA-dicを使用(MeCabに付属していたせい)

1/4 単語の辞書を用意

Page 7: スペル修正プログラムの作り方 #pronama

1/4 単語の辞書を用意

辞書の中身(IPA-dicの場合)

きらびやか,1287,1287,8349,名詞,形容動詞語幹,* ,* , * , * ,きらびやか,キラビヤカ,キラビヤカ

史的,1287,1287,6608,名詞,形容動詞語幹,* ,* , * , * ,史的,シテキ,シテキ

プラトニック,1287,1287,5077,名詞,形容動詞語幹,* ,* , * , * ,プラトニック,プラトニック,. . (略)

てらてら,1287,1287,8349,名詞,形容動詞語幹,* ,* , * , * ,てらてら,テラテラ,テラテラ

静謐静謐,1287,1287,4845,名詞,形容動詞語幹,* ,* , * , * ,静謐,セイヒツ,セイヒツ

今回はここしか使わない

Page 8: スペル修正プログラムの作り方 #pronama

2/4 受け取った文字が辞書にあるか

・さっきの単語辞書と受け取った文字を照合 ・合っていたら(=誤字じゃなければ)そのまま出力

・合っていなければ、誤字扱いで次の段階へ

Page 9: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

辞書に正解の文字があると仮定正解を書こうとして誤字する確率の誤りモデルを計算

辞書

Microsoft

Google

Yahoo

.. . . .

Mycrosoft

Page 10: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

誤りモデルを数値で出すために、編集距離を求める

・編集距離とは

入力文字列に最低何回の編集操作をすれば 正解が求まるかという数値。

1つの文字に対して ・挿入 ・削除 ・置き換え ・転置      を繰り返す

Page 11: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

編集距離の例

誤字 単語

・挿入: スペルミッス → スペルミス・削除: スペミス   → スペルミス・置換: スプルミス  → スペルミス・転置: スペミルス  → スペルミス

Page 12: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

編集距離を使えば、簡単に誤字を探せる!

Page 13: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

はずもなく

Page 14: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・問題点 漢字が多すぎて実用的じゃない(アルファベットだけなら大丈夫)

毎回20万語と比較しなきゃいけない

3文字の比較量は1回の編集距離だけで

{(5,000*4)+3+(5,000*3)+3}*200,000 = 7,001,200,000回

Page 15: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・じゃあどうするの?

前もって候補を絞る = N-gram で修正候補の絞り込み

Page 16: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・N-gram で修正候補の絞り込み N-gramって?

文字をN個ずつ切り出すという意味 自然言語処理にいろいろと使われてる。

とろとき = [とろ][ろと][とき]

Nの個数で名前が変わる 1文字 ・・・ ユニグラム [と][ろ][と][き]

2文字 ・・・ バイグラム [とろ][ろと][とき]

3文字 ・・・ トリグラム [とろと][ろとろ][とき]

単純にN-gramといえば基本的にバイグラム(2文字ずつ)

・例外にもれず今回はバイグラムを使用

Page 17: スペル修正プログラムの作り方 #pronama

次官, 政治次官, 次官補, 事務次官

3/4 誤字を辞書と比較

・N-gram で修正候補の絞り込み どうやって絞り込むの? 辞書から全単語のN-gramインデックスを作る

いう

ごり

次官

あいうち, あっという間, ねらいうち, . .

にごり酒, おごり, 名ごり, ごりごり, . .

Page 18: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・N-gram で修正候補の絞り込み どうやって絞り込むの? 入力 “データベaス” → デー + ータ + タベ + ベa + aス N-gramインデックスで複数回ヒットするもの

参考: http:/ /www.slideshare.net/naoya1977/spell-correction

‘デー’ : "データテレホン" , "データセット" , "データタブレット", "データベース "

‘ータ’ : "インバータ" , "データベース " , "オータックス" , "ポータブル" ,

‘タベ’ : "ベタベタ" , "データベース " , "ヌタベット" , "カンタベリー" ,

‘ベa’ : . . .

‘ aス ’ : . . .

Page 19: スペル修正プログラムの作り方 #pronama

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) などができていない 編集距離を少しでも多く出すためには?

Page 20: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・編集距離にも工夫

挿入   削除  置換 転置 { (5,000*4)+3+(5,000*3)+3}*4 = 140,024回

編集距離の計算で回数を多くしているのは

5,000*4(挿入) と 5,000*3(置き換え) の式  ※ 5,000 は漢字及びひらがなとカタカナの数

2回目以降に編集距離を求めるときは、 挿入 置き換え の作業を消せばよいのでは?

Page 21: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・編集距離にも工夫 2回目以降は 挿入 と 置換 を求めないことで

({(5,000*4)+3+(5,000*3)+3} * 4 * {(3+3)*4} = 3,360,576回

と編集距離2もギリギリ求められるくらいにできる (ただしやってみたところ4~6秒の時間がかかった)

言語を変える、並列化する、などして高速化の必要あり?

Page 22: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・編集距離が同じ場合の対処 goolに対して編集距離が1

goa l / goo / good / . . .

スペルミスの80~95%は編集距離が1らしい[要出典]

・文章の出現頻度が高い語ほど正解に近いとする(DF) goodの頻度が高い → goodが正解と推測 でもgoalが正解でもおかしくないじゃん!

Page 23: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・短い単語は求めにくい gool はスペルミスだけど、「good」が正解とはいいにくい 実は結構難しい問題 ・そもそも短い語に対しては Google すらできてない

「もしかして」が出てない図

Page 24: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・短い単語は求めにくい ・応急策(その1)

Improved Error Model(ちょっとだけ取り入れ)

単語の先頭は誤りにくいよね? ・先頭、中間、最後の3値で計算

・ただし、まだ gool→good の問題は解決できない。 むしろ悪化

Page 25: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・応急策その2 置換操作の文字によって優先順位をつける

- 「a」と「n」は間違えにくい

- 「p」と「o」は間違えやすい

- これだとgool→good問題は解決できそうだけど・・・。

- 当然、漢字は不可

Page 26: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・応急策その2A spe ll ing Correction p rog ram based on anoisy channe l model(M. Kernighan1990)

Page 27: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・まとめ ・まず誤字かどうか判別 ・N-gramで候補を絞る ・絞った候補と入力文字の編集距離を計算 - 候補が被ったら最も一般的な語を使う ・最も数値の高かった候補を出す

Page 28: スペル修正プログラムの作り方 #pronama

3/4 誤字を辞書と比較

・デモ

Page 29: スペル修正プログラムの作り方 #pronama

豆知識的な応用事例

・ N-gram N-gramによる誤字候補の絞り

- 類似文字の索引にも使える

- コピペ論文を検出する論文まであった

剽窃レポート発見に利用する1文単位での検索クエリ作成手法 http: //ci.nii. ac . jp/naid/110007467248

Page 30: スペル修正プログラムの作り方 #pronama

豆知識的な応用事例

・EM-based Error Model

EM-based Er ror Model ・検索エンジンからスペルミスを機械学習 ・あまり詳しくない ・引用すると

・(検索エンジンの)クエリログからクエリの訂正を行う ・誤りと正解のペアデータは必要ない ・クエリログは10~15%のスペルミスを  含むので、ここから学習

引用: スペル訂正エンジンについてのサーベイ #TokyoNLPhttp : / /www.sl ideshare .net/nokuno/tokyonlp05-spe ll-correction

Page 31: スペル修正プログラムの作り方 #pronama

ご清聴ありがとうございました。

Page 32: スペル修正プログラムの作り方 #pronama

参考文献

・「入門自然言語処理」

オライリージャパン 2010年11月発行 , 592ページ

・スペル修正プログラムはどう書くか http: //bit . ly/c3BHf

・スペルミス修正プログラムを作ろう http: //sl idesha . re/qghImL

・スペル訂正エンジンのサーベイ・スペル訂正エンジンのサーベイ http: //sl idesha . re/g7SImR