SlideShare a Scribd company logo
スペルミス修正プログラム を作ろう 伊藤 直也 株式会社はてな
もしかして
スペルミス修正プログラム 入力: 伊藤直 哉  -> 伊藤直 也 では? 幾つかの手法 辞書との比較 ・・・ 今回紹介する手法 検索ログなどから推定 Google, Yahoo! など検索エンジンの手法?
小話
今回作ったもの 辞書 ・・・ はてなキーワード ウェブからダウンロードできます http://d.hatena.ne.jp/hatenadiary/20060922/1158908401 入力文字に対して辞書から正解っぽいものを推定して提示
デモ
スペルミス修正プログラムの考え方 辞書に正解がある 入力と正解を比較して「誤り度」を調べる -> 「誤り度」の定量化
編集距離  (Levenshtein 距離 ) 二つの文字列がどの程度異なっているかを示す数値 文字の挿入, 削除, 置換で一方を他方に変形するための最小の手順回数 伊藤直哉, 伊藤直也 -> 1 伊藤直, 伊藤直也 -> 1 佐藤直哉, 伊藤直也 -> 2 佐藤B作, 伊藤直也 -> 3
編集距離の計算 動的計画法 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]; }
参考 : Perl  で編集距離 CPAN Text::Levenshtein Text::LevenshteinXS ※いずれも Unicode 未対応
辞書全体に編集距離を計算 ? 20万語以上全てとの編集距離を計算 非現実的 距離を計算する対象をあらかじめ絞る Nグラムインデックスを利用する
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)  より
N グラムインデックスを使った修正候補の絞り込み 入力 &quot;bord&quot; -> bo + or + rd Nグラム索引で2回以上ヒットするもの すなわち入力と「被り」が多いもの bo aboard about boardroom border or border lord morbid sordid rd aboard ardent boardroom border
ここまでの流れ 入力に対してbigram索引で被りが多いものを候補として取得 各候補に対して編集距離を計算 距離が近いものほど正解である可能性が高い 伊藤直哉に対し... 伊藤直也  1 ←  これ ! 佐藤直也 2
編集距離が同じ語が辞書にあった場合 伊藤直哉に対し編集距離が 1 伊藤直也 ,  佐藤直也 ,  伊東直也  ... 多くの文書に出現する語ほど正解に近いとする Document Frequency (DF) 今回は、はてなブックマークでの各語の  DF  を利用した 伊藤直也が頻出 -> 「正解は 伊藤直也 では ? 」 元の入力の  DF  の方が推定したものより高い場合 -> そもそも間違ってない
編集距離を改善 編集距離はどこが異なっていてもスコアが同じ 伊藤直哉に対して  &quot; 伊藤直也 &quot;  も  &quot; 佐藤直也 &quot;  も同じスコア Jaro-Winkler  距離 see:  en.wikipedia.org/wiki/Jaro-Winkler_distance 前にある語が違うほどペナルティが高い 後半ほど間違いやすく、前半を間違えることはないという仮定 人名など短い語では  Levenshtein  距離よりも精度が高い ...? Jaro-Winkler  距離にしたところ、精度が向上 最終的なスコア ・・・  (Jaro-Winkler  距離 ) x (idf  の逆数 )
Jaro-Winkler 距離 拙作ライブラリ http://github.com/naoya/perl-text-jarowinkler/ Lucene  からの移植   Unicode  対応 参考 : CPAN Text::JaroWinkler Text::JaroWinklerXS ※  いずれも  Unicode   非対応
今回紹介した一連の実装のソース github http:// github.com/naoya/algorithm-kgramindex/
なぜこれで正解が求まるのか &quot; 雑音のある通信路モデル &quot; 雑音により誤りが混入した符号系列  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'
事後確率最大法 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)
argmax w  P(Y|W)P(W) P(Y|W) 尤度: 誤りモデル (誤りの性質) 正解 W が与えられたとき観測データ Y が生起する確率 今回は Jaro-Winkler 距離 P(W) 事前確率: 言語モデル 文法的な正しさ 今回は DF (相対頻度) [ 参考 ]  検索ログを使う場合 P(Y|W)  クリックログ等から推定 P(W)  は検索ログからの相対頻度
まとめ スペルミス修正プログラムのアルゴリズムを紹介した bigramインデックスで絞り込んだ候補のJaro-Winkler 距離を比較する 正解候補の最もらしさは DF で与える 雑音のある通信路モデルにより確率統計的自然言語処理の問題として考えられる 誤りモデルが Jaro-Winkler 距離、言語モデルが DF
参考文献 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

More Related Content

PDF
JJUG CCC リクルートの Java に対する取り組み
PDF
Riverpodでテストを書こう
PDF
SSL/TLSの基礎と最新動向
PPTX
雑談会議 Azure AD B2C 第一回
PDF
組織にテストを書く文化を根付かせる戦略と戦術
PDF
CyberAgentのPrivateCloudeを支えるStorage基盤
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
PPTX
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
JJUG CCC リクルートの Java に対する取り組み
Riverpodでテストを書こう
SSL/TLSの基礎と最新動向
雑談会議 Azure AD B2C 第一回
組織にテストを書く文化を根付かせる戦略と戦術
CyberAgentのPrivateCloudeを支えるStorage基盤
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...

What's hot (20)

PDF
アジャイル開発におけるクラフトマンシップの重要性
PDF
「なにをどこまでやれば?」OWASP SAMMが導く開発セキュリティ強化戦略
PPTX
テスト技法の背景を考察する - WACATE2021夏
PDF
AWSによるグラフDB構築
PDF
MySQLからPostgreSQLへのマイグレーションのハマリ所
PDF
Responsableを使ったadr実装
ODP
Yiiフレームワークを使ってみた
PDF
イミュータブルデータモデルの極意
PDF
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
PDF
ケンブリッジを職場に選ぶ理由(2021年9月15日版)
PDF
Cartesian Closed Category
PPTX
設計と実装で 抑えておきたい サービスクラスと例外
PDF
ネットワーク超入門
PPTX
世界一わかりやすいClean Architecture - DroidKaigiバージョン
PDF
GoogleのSHA-1のはなし
PPTX
テストコードの DRY と DAMP
PDF
正しいものを正しく作る塾-設計コース
PDF
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
PPTX
TDDはじめる前に
PDF
Pythonではじめる競技プログラミング
アジャイル開発におけるクラフトマンシップの重要性
「なにをどこまでやれば?」OWASP SAMMが導く開発セキュリティ強化戦略
テスト技法の背景を考察する - WACATE2021夏
AWSによるグラフDB構築
MySQLからPostgreSQLへのマイグレーションのハマリ所
Responsableを使ったadr実装
Yiiフレームワークを使ってみた
イミュータブルデータモデルの極意
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
ケンブリッジを職場に選ぶ理由(2021年9月15日版)
Cartesian Closed Category
設計と実装で 抑えておきたい サービスクラスと例外
ネットワーク超入門
世界一わかりやすいClean Architecture - DroidKaigiバージョン
GoogleのSHA-1のはなし
テストコードの DRY と DAMP
正しいものを正しく作る塾-設計コース
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
TDDはじめる前に
Pythonではじめる競技プログラミング
Ad

Viewers also liked (7)

PPT
about Thrift
PDF
Scalaでプログラムを作りました
ODP
ぷよぷよAIの新しい探索法
PPTX
カルマンフィルタについて
PDF
Scala + Finagleの魅力
PDF
アルゴリズムのイメージを擬人化する
PDF
機械学習チュートリアル@Jubatus Casual Talks
about Thrift
Scalaでプログラムを作りました
ぷよぷよAIの新しい探索法
カルマンフィルタについて
Scala + Finagleの魅力
アルゴリズムのイメージを擬人化する
機械学習チュートリアル@Jubatus Casual Talks
Ad

Similar to スペルミス修正プログラムを作ろう (20)

PDF
スペル修正プログラムの作り方 #pronama
PDF
サブカルのためのWord2vec
KEY
Algebraic DP: 動的計画法を書きやすく
PPTX
Approximate Scalable Bounded Space Sketch for Large Data NLP
PDF
R による文書分類入門
PDF
やさしい日本語言い換えシステムを支える技術
PPTX
dont_count_predict_in_acl2014
PDF
Effective search space reduction for spell correction using character neural ...
PPTX
Mahoutにパッチを送ってみた
PPTX
さくっとはじめるテキストマイニング(R言語)  スタートアップ編
PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
PDF
100816 nlpml sec2
PDF
Web フィルタリング最前線: 「「検閲回避」回避」 角田孝昭
PDF
NLP2012
PPTX
Probabilistic fasttext for multi sense word embeddings
PDF
PFI Christmas seminar 2009
PPTX
Machine Learning Seminar (5)
PDF
第28回Tokyo.R
PDF
鬱くしい日本語のための形態素解析入門
PDF
統計的係り受け解析入門
スペル修正プログラムの作り方 #pronama
サブカルのためのWord2vec
Algebraic DP: 動的計画法を書きやすく
Approximate Scalable Bounded Space Sketch for Large Data NLP
R による文書分類入門
やさしい日本語言い換えシステムを支える技術
dont_count_predict_in_acl2014
Effective search space reduction for spell correction using character neural ...
Mahoutにパッチを送ってみた
さくっとはじめるテキストマイニング(R言語)  スタートアップ編
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
100816 nlpml sec2
Web フィルタリング最前線: 「「検閲回避」回避」 角田孝昭
NLP2012
Probabilistic fasttext for multi sense word embeddings
PFI Christmas seminar 2009
Machine Learning Seminar (5)
第28回Tokyo.R
鬱くしい日本語のための形態素解析入門
統計的係り受け解析入門

More from Naoya Ito (13)

PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
PPT
Titanium Mobile
PPT
Scripting Layer for Android + Perl
PPT
Web-Gakkai Symposium 2010
PPT
はてなブックマークのシステムについて
PPT
Perlで圧縮
PPT
Introduction to Algorithms#24 Shortest-Paths Problem
PPT
090518computing Huffman Code Length
PPT
Dijkstra Algorithm
PPT
OGC2009 はてなブックマークについて
PPT
081108huge_data.ppt
PPT
How to read linux kernel
PPT
Introduction To Moco
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Titanium Mobile
Scripting Layer for Android + Perl
Web-Gakkai Symposium 2010
はてなブックマークのシステムについて
Perlで圧縮
Introduction to Algorithms#24 Shortest-Paths Problem
090518computing Huffman Code Length
Dijkstra Algorithm
OGC2009 はてなブックマークについて
081108huge_data.ppt
How to read linux kernel
Introduction To Moco

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