スペルミス修正プログラムを作ろう

7,323 views

Published on

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,323
On SlideShare
0
From Embeds
0
Number of Embeds
2,875
Actions
Shares
0
Downloads
44
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

スペルミス修正プログラムを作ろう

  1. 1. スペルミス修正プログラム を作ろう 伊藤 直也 株式会社はてな
  2. 2. もしかして
  3. 3. スペルミス修正プログラム <ul><li>入力: 伊藤直 哉 -> 伊藤直 也 では? </li></ul><ul><li>幾つかの手法 </li></ul><ul><ul><li>辞書との比較 ・・・ 今回紹介する手法 </li></ul></ul><ul><ul><li>検索ログなどから推定 </li></ul></ul><ul><ul><ul><li>Google, Yahoo! など検索エンジンの手法? </li></ul></ul></ul>
  4. 4. 小話
  5. 5. 今回作ったもの <ul><li>辞書 ・・・ はてなキーワード </li></ul><ul><ul><li>ウェブからダウンロードできます </li></ul></ul><ul><ul><li>http://d.hatena.ne.jp/hatenadiary/20060922/1158908401 </li></ul></ul><ul><li>入力文字に対して辞書から正解っぽいものを推定して提示 </li></ul>
  6. 6. デモ
  7. 7. スペルミス修正プログラムの考え方 <ul><li>辞書に正解がある </li></ul><ul><li>入力と正解を比較して「誤り度」を調べる </li></ul><ul><li>-> 「誤り度」の定量化 </li></ul>
  8. 8. 編集距離 (Levenshtein 距離 ) <ul><li>二つの文字列がどの程度異なっているかを示す数値 </li></ul><ul><ul><li>文字の挿入, 削除, 置換で一方を他方に変形するための最小の手順回数 </li></ul></ul><ul><ul><ul><li>伊藤直哉, 伊藤直也 -> 1 </li></ul></ul></ul><ul><ul><ul><li>伊藤直, 伊藤直也 -> 1 </li></ul></ul></ul><ul><ul><ul><li>佐藤直哉, 伊藤直也 -> 2 </li></ul></ul></ul><ul><ul><ul><li>佐藤B作, 伊藤直也 -> 3 </li></ul></ul></ul>
  9. 9. 編集距離の計算 <ul><li>動的計画法 </li></ul>sub distance { my ($s1, $s2) = validate_pos(@_, 1, 1); my $m = []; my @s1 = split //, $s1; my @s2 = split //, $s2; for (my $i = 0; $i <= @s1; $i++) { $m->[$i]->[0] = $i; } for (my $j = 0; $j <= @s2; $j++) { $m->[0]->[$j] = $j; } for (my $i = 1; $i <= @s1; $i++) { for (my $j = 1; $j <= @s2; $j++) { my $diff = ($s1[ $i - 1 ] eq $s2[ $j - 1]) ? 0 : 1; $m->[$i]->[$j] = min( $m->[$i - 1]->[$j - 1] + $diff, $m->[$i - 1]->[$j] + 1, $m->[$i]->[$j - 1] + 1 ); } } return $m->[-1]->[-1]; }
  10. 10. 参考 : Perl で編集距離 <ul><li>CPAN </li></ul><ul><ul><li>Text::Levenshtein </li></ul></ul><ul><ul><li>Text::LevenshteinXS </li></ul></ul><ul><ul><li>※いずれも Unicode 未対応 </li></ul></ul>
  11. 11. 辞書全体に編集距離を計算 ? <ul><li>20万語以上全てとの編集距離を計算 </li></ul><ul><ul><li>非現実的 </li></ul></ul><ul><li>距離を計算する対象をあらかじめ絞る </li></ul><ul><ul><li>Nグラムインデックスを利用する </li></ul></ul>
  12. 12. N グラムインデックス <ul><li>bi-gram </li></ul><ul><ul><li>algorithm -> al, lg, go, or, ri, it, th, hm </li></ul></ul><ul><li>全単語の bigram の索引を作る </li></ul>bo aboard about boardroom border or border lord morbid sordid rd aboard ardent boardroom border Introduction to Information Retreival #3 (P.56) より
  13. 13. N グラムインデックスを使った修正候補の絞り込み <ul><li>入力 &quot;bord&quot; -> bo + or + rd </li></ul><ul><ul><li>Nグラム索引で2回以上ヒットするもの </li></ul></ul><ul><ul><li>すなわち入力と「被り」が多いもの </li></ul></ul>bo aboard about boardroom border or border lord morbid sordid rd aboard ardent boardroom border
  14. 14. ここまでの流れ <ul><li>入力に対してbigram索引で被りが多いものを候補として取得 </li></ul><ul><li>各候補に対して編集距離を計算 </li></ul><ul><li>距離が近いものほど正解である可能性が高い </li></ul><ul><ul><li>伊藤直哉に対し... </li></ul></ul><ul><ul><ul><li>伊藤直也 1 ← これ ! </li></ul></ul></ul><ul><ul><ul><li>佐藤直也 2 </li></ul></ul></ul>
  15. 15. 編集距離が同じ語が辞書にあった場合 <ul><li>伊藤直哉に対し編集距離が 1 </li></ul><ul><ul><li>伊藤直也 , 佐藤直也 , 伊東直也 ... </li></ul></ul><ul><li>多くの文書に出現する語ほど正解に近いとする </li></ul><ul><ul><li>Document Frequency (DF) </li></ul></ul><ul><ul><li>今回は、はてなブックマークでの各語の DF を利用した </li></ul></ul><ul><ul><li>伊藤直也が頻出 -> 「正解は 伊藤直也 では ? 」 </li></ul></ul><ul><ul><li>元の入力の DF の方が推定したものより高い場合 -> そもそも間違ってない </li></ul></ul>
  16. 16. 編集距離を改善 <ul><li>編集距離はどこが異なっていてもスコアが同じ </li></ul><ul><ul><li>伊藤直哉に対して &quot; 伊藤直也 &quot; も &quot; 佐藤直也 &quot; も同じスコア </li></ul></ul><ul><li>Jaro-Winkler 距離 </li></ul><ul><ul><li>see: en.wikipedia.org/wiki/Jaro-Winkler_distance </li></ul></ul><ul><ul><li>前にある語が違うほどペナルティが高い </li></ul></ul><ul><ul><ul><li>後半ほど間違いやすく、前半を間違えることはないという仮定 </li></ul></ul></ul><ul><ul><ul><li>人名など短い語では Levenshtein 距離よりも精度が高い ...? </li></ul></ul></ul><ul><ul><li>Jaro-Winkler 距離にしたところ、精度が向上 </li></ul></ul><ul><ul><ul><li>最終的なスコア ・・・ (Jaro-Winkler 距離 ) x (idf の逆数 ) </li></ul></ul></ul>
  17. 17. Jaro-Winkler 距離 <ul><li>拙作ライブラリ </li></ul><ul><ul><li>http://github.com/naoya/perl-text-jarowinkler/ </li></ul></ul><ul><ul><li>Lucene からの移植 </li></ul></ul><ul><ul><li>Unicode 対応 </li></ul></ul><ul><li>参考 : CPAN </li></ul><ul><ul><li>Text::JaroWinkler </li></ul></ul><ul><ul><li>Text::JaroWinklerXS </li></ul></ul><ul><ul><li>※ いずれも Unicode 非対応 </li></ul></ul>
  18. 18. 今回紹介した一連の実装のソース <ul><li>github </li></ul><ul><ul><li>http:// github.com/naoya/algorithm-kgramindex/ </li></ul></ul>
  19. 19. なぜこれで正解が求まるのか <ul><li>&quot; 雑音のある通信路モデル &quot; </li></ul><ul><ul><li>雑音により誤りが混入した符号系列 Y から元の情報源系列 W を推定した W' を出力 </li></ul></ul><ul><ul><ul><li>誤りの性質 ・・・ P(Y|X) </li></ul></ul></ul><ul><ul><li>多くの自然言語処理の問題に適用できる (W = X) </li></ul></ul><ul><ul><ul><li>音声認識、機械翻訳、かな漢字変換 </li></ul></ul></ul><ul><ul><li>直接観測できるのは Y: Y から W を求める問題と考える </li></ul></ul><ul><ul><li>スペルミス修正 : 雑音により誤った符号 Y が与えられたとき本当の正解 W ・・・ argmax w P(W|Y) </li></ul></ul>符号部 通信部 復号部 雑音 情報源系列 出力系列 『確率的言語モデル』 第 2 章 (P.32) より W X Y W'
  20. 20. 事後確率最大法 <ul><li>argmax W P(W|Y) </li></ul><ul><ul><li>W ・・・ 正解 </li></ul></ul><ul><ul><li>Y ・・・ 入力 </li></ul></ul><ul><ul><li>入力 Y を観測した後で正解 W である確率 ・・・ 事後確率 </li></ul></ul><ul><li>P(W|Y) = P(Y|W)P(W) / P(Y) </li></ul><ul><ul><li>求めるべきは argmax w なので P(Y) は無視 </li></ul></ul><ul><ul><li>よって考えるべきは argmax w P(Y|W)P(W) </li></ul></ul>
  21. 21. argmax w P(Y|W)P(W) <ul><li>P(Y|W) </li></ul><ul><ul><li>尤度: 誤りモデル (誤りの性質) </li></ul></ul><ul><ul><ul><li>正解 W が与えられたとき観測データ Y が生起する確率 </li></ul></ul></ul><ul><ul><li>今回は Jaro-Winkler 距離 </li></ul></ul><ul><li>P(W) </li></ul><ul><ul><li>事前確率: 言語モデル </li></ul></ul><ul><ul><ul><li>文法的な正しさ </li></ul></ul></ul><ul><ul><li>今回は DF (相対頻度) </li></ul></ul><ul><li>[ 参考 ] 検索ログを使う場合 </li></ul><ul><li>P(Y|W) クリックログ等から推定 </li></ul><ul><li>P(W) は検索ログからの相対頻度 </li></ul>
  22. 22. まとめ <ul><li>スペルミス修正プログラムのアルゴリズムを紹介した </li></ul><ul><li>bigramインデックスで絞り込んだ候補のJaro-Winkler 距離を比較する </li></ul><ul><li>正解候補の最もらしさは DF で与える </li></ul><ul><li>雑音のある通信路モデルにより確率統計的自然言語処理の問題として考えられる </li></ul><ul><ul><li>誤りモデルが Jaro-Winkler 距離、言語モデルが DF </li></ul></ul>
  23. 23. 参考文献 <ul><li>C. D. Manning, P. Raghavan, H. Schutze 『 Introduction to Information Retrieval 』 , Cambridge University Press,2008 </li></ul><ul><li>北研二 『確率的言語モデル』 , 東京大学出版会 , 1999 </li></ul><ul><li>荒木雅弘『フリーソフトでつくる音声認識システム』 , 森北出版 , 2007 </li></ul><ul><li>Peter Norvig, 青木靖 ( 訳 ) 『 スペル修正プログラムはどう書くか 』 , http://norvig.com/spell-correct.html , 2007 </li></ul>

×