Recommended JJUG CCC リクルートの Java に対する取り組み
CyberAgentのPrivateCloudeを支えるStorage基盤
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
「なにをどこまでやれば?」OWASP SAMMが導く開発セキュリティ強化戦略
テスト技法の背景を考察する - WACATE2021夏
MySQLからPostgreSQLへのマイグレーションのハマリ所
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
ケンブリッジを職場に選ぶ理由(2021年9月15日版)
Cartesian Closed Category
設計と実装で 抑えておきたい サービスクラスと例外
世界一わかりやすいClean Architecture - DroidKaigiバージョン
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
More Related Content JJUG CCC リクルートの Java に対する取り組み
CyberAgentのPrivateCloudeを支えるStorage基盤
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
What's hot (20)
「なにをどこまでやれば?」OWASP SAMMが導く開発セキュリティ強化戦略
テスト技法の背景を考察する - WACATE2021夏
MySQLからPostgreSQLへのマイグレーションのハマリ所
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
ケンブリッジを職場に選ぶ理由(2021年9月15日版)
Cartesian Closed Category
設計と実装で 抑えておきたい サービスクラスと例外
世界一わかりやすいClean Architecture - DroidKaigiバージョン
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
Viewers also liked (7)
機械学習チュートリアル@Jubatus Casual Talks
Similar to スペルミス修正プログラムを作ろう (20)
Algebraic DP: 動的計画法を書きやすく
Approximate Scalable Bounded Space Sketch for Large Data NLP
dont_count_predict_in_acl2014
Effective search space reduction for spell correction using character neural ...
さくっとはじめるテキストマイニング(R言語) スタートアップ編
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
Web フィルタリング最前線: 「「検閲回避」回避」 角田孝昭
Probabilistic fasttext for multi sense word embeddings
PFI Christmas seminar 2009
Machine Learning Seminar (5)
More from Naoya Ito (13) SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Scripting Layer for Android + Perl
Web-Gakkai Symposium 2010
Introduction to Algorithms#24 Shortest-Paths Problem
090518computing Huffman Code Length
スペルミス修正プログラムを作ろう3. スペルミス修正プログラム 入力: 伊藤直 哉 -> 伊藤直 也 では? 幾つかの手法 辞書との比較 ・・・ 今回紹介する手法 検索ログなどから推定 Google, Yahoo! など検索エンジンの手法? 5. 今回作ったもの 辞書 ・・・ はてなキーワード ウェブからダウンロードできます http://d.hatena.ne.jp/hatenadiary/20060922/1158908401 入力文字に対して辞書から正解っぽいものを推定して提示 8. 編集距離 (Levenshtein 距離 ) 二つの文字列がどの程度異なっているかを示す数値 文字の挿入, 削除, 置換で一方を他方に変形するための最小の手順回数 伊藤直哉, 伊藤直也 -> 1 伊藤直, 伊藤直也 -> 1 佐藤直哉, 伊藤直也 -> 2 佐藤B作, 伊藤直也 -> 3 9. 編集距離の計算 動的計画法 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. 参考 : Perl で編集距離 CPAN Text::Levenshtein Text::LevenshteinXS ※いずれも Unicode 未対応 12. N グラムインデックス bi-gram algorithm -> al, lg, go, or, ri, it, th, hm 全単語の bigram の索引を作る bo aboard about boardroom border or border lord morbid sordid rd aboard ardent boardroom border Introduction to Information Retreival #3 (P.56) より 13. N グラムインデックスを使った修正候補の絞り込み 入力 "bord" -> bo + or + rd Nグラム索引で2回以上ヒットするもの すなわち入力と「被り」が多いもの bo aboard about boardroom border or border lord morbid sordid rd aboard ardent boardroom border 15. 編集距離が同じ語が辞書にあった場合 伊藤直哉に対し編集距離が 1 伊藤直也 , 佐藤直也 , 伊東直也 ... 多くの文書に出現する語ほど正解に近いとする Document Frequency (DF) 今回は、はてなブックマークでの各語の DF を利用した 伊藤直也が頻出 -> 「正解は 伊藤直也 では ? 」 元の入力の DF の方が推定したものより高い場合 -> そもそも間違ってない 16. 編集距離を改善 編集距離はどこが異なっていてもスコアが同じ 伊藤直哉に対して " 伊藤直也 " も " 佐藤直也 " も同じスコア Jaro-Winkler 距離 see: en.wikipedia.org/wiki/Jaro-Winkler_distance 前にある語が違うほどペナルティが高い 後半ほど間違いやすく、前半を間違えることはないという仮定 人名など短い語では Levenshtein 距離よりも精度が高い ...? Jaro-Winkler 距離にしたところ、精度が向上 最終的なスコア ・・・ (Jaro-Winkler 距離 ) x (idf の逆数 ) 17. Jaro-Winkler 距離 拙作ライブラリ http://github.com/naoya/perl-text-jarowinkler/ Lucene からの移植 Unicode 対応 参考 : CPAN Text::JaroWinkler Text::JaroWinklerXS ※ いずれも Unicode 非対応 19. なぜこれで正解が求まるのか " 雑音のある通信路モデル " 雑音により誤りが混入した符号系列 Y から元の情報源系列 W を推定した W' を出力 誤りの性質 ・・・ P(Y|X) 多くの自然言語処理の問題に適用できる (W = X) 音声認識、機械翻訳、かな漢字変換 直接観測できるのは Y: Y から W を求める問題と考える スペルミス修正 : 雑音により誤った符号 Y が与えられたとき本当の正解 W ・・・ argmax w P(W|Y) 符号部 通信部 復号部 雑音 情報源系列 出力系列 『確率的言語モデル』 第 2 章 (P.32) より W X Y W' 20. 事後確率最大法 argmax W P(W|Y) W ・・・ 正解 Y ・・・ 入力 入力 Y を観測した後で正解 W である確率 ・・・ 事後確率 P(W|Y) = P(Y|W)P(W) / P(Y) 求めるべきは argmax w なので P(Y) は無視 よって考えるべきは argmax w P(Y|W)P(W) 21. argmax w P(Y|W)P(W) P(Y|W) 尤度: 誤りモデル (誤りの性質) 正解 W が与えられたとき観測データ Y が生起する確率 今回は Jaro-Winkler 距離 P(W) 事前確率: 言語モデル 文法的な正しさ 今回は DF (相対頻度) [ 参考 ] 検索ログを使う場合 P(Y|W) クリックログ等から推定 P(W) は検索ログからの相対頻度 23. 参考文献 C. D. Manning, P. Raghavan, H. Schutze 『 Introduction to Information Retrieval 』 , Cambridge University Press,2008 北研二 『確率的言語モデル』 , 東京大学出版会 , 1999 荒木雅弘『フリーソフトでつくる音声認識システム』 , 森北出版 , 2007 Peter Norvig, 青木靖 ( 訳 ) 『 スペル修正プログラムはどう書くか 』 , http://norvig.com/spell-correct.html , 2007