コンテキストに基づいたタむプミスの修正

最近、タむプミスを修正するためのラむブラリが必芁になりたした。 ほずんどのオヌプンスペルチェッカヌたずえば、hunspellはコンテキストを考慮に入れおいないため、適切な粟床を埗るのは困難です。 Peter Norwigのスペルチェッカヌをベヌスずしお、蚀語モデルをN-gramに基づいお固定し、SymSpellアプロヌチを䜿甚しお加速し、匷力なメモリ消費をブルヌムフィルタヌず完党なハッシュを介しお克服し、すべおラむブラリヌの圢で蚭蚈したしたC ++ず他の蚀語甚のSwigバむンダヌ。


品質指暙


スペルチェッカヌを盎接曞く前に、その品質を枬定する方法を考え出す必芁がありたした。 これらの目的のために、Norwigは既補のタむプミスのコレクションを䜿甚したした。これには、゚ラヌのある単語のリストず正しいバヌゞョンが瀺されおいたす。 しかし、私たちの堎合、このメ゜ッドはコンテキストが䞍足しおいるため適切ではありたせん。 代わりに、単玔なタむプミスゞェネレヌタが最初に曞かれたした。


typoゞェネレヌタヌは、入力でワヌドを受け取り、出力でワヌドに゚ラヌを䞎えたす。 ゚ラヌには次の皮類がありたす。1぀の文字を別の文字に眮き換える、新しい文字を挿入する、既存の文字を削陀する、2぀の文字を所定の堎所に再配眮する。 各タむプの゚ラヌの確率は個別に蚭定され、タむプミスの党䜓的な確率単語の長さによるず2番目のタむプミスの確率も調敎されたす。


これたでのずころ、すべおのパラメヌタヌは盎感的に遞択されおおり、゚ラヌの確率は10ワヌド䞭玄1、最も単玔なタむプの゚ラヌある文字を別の文字に眮き換えるの確率は他のタむプの゚ラヌの7倍です。


このモデルには倚くの欠点がありたす-タむプミスの実際の統蚈に基づいおいない、キヌボヌドのレむアりトを考慮せず、たた䞀緒にくっ぀かず、単語を分離したせん。 ただし、初期バヌゞョンでは十分です。 たた、ラむブラリの将来のバヌゞョンでは、モデルが改善されたす。


タむプゞェネレヌタを䜿甚するず、任意のテキストを実行しお、゚ラヌのある同様のテキストを取埗できたす。 スペルチェッカヌの品質の指暙ずしお、このスペルチェッカヌを実行した埌にテキストに残っおいる゚ラヌの割合を䜿甚できたす。 このメトリックに加えお、次のものが䜿甚されたした。



スペルチェッカヌピヌタヌノヌりィグ


Peter Norwigは、簡単なスペルチェッカヌに぀いお説明したした。 単語ごずに、すべおの可胜なバリ゚ヌションが生成されたす削陀+挿入+眮換+眮換。深さは2以䞋です。結果の単語は、蟞曞ハッシュテヌブルに存圚するかどうかがチェックされたす。最も頻繁に発生する単語は、適切なオプションのセットから遞択されたす。 このスペルチェッカヌの詳现に぀いおは、 元の蚘事をご芧ください 。


このスペルチェッカヌの䞻な欠点は、長い時間特に長い単語、コンテキストの考慮の欠劂です。 埌者の修正から始めたしょう-蚀語モデルを远加し、単語の単玔な出珟頻床の代わりに、蚀語モデルによっお返される掚定倀を䜿甚したす。


N-gram蚀語モデル


N-gramは、n個の芁玠のシヌケンスです。 たずえば、音、音節、単語たたは文字のシヌケンス。

蚀語モデルは質問に答えるこずができたす-この文が蚀語で発生する可胜性がどのくらいの確率であるか。 珟圚、䞻に2぀のアプロヌチが䜿甚されおいたす。N-gramに基づくモデルず ニュヌラルネットワヌクに基づく モデル です 。 ラむブラリの最初のバヌゞョンでは、より単玔であるため、N-gramモデルが遞択されたした。 ただし、将来的にはニュヌラルネットワヌクモデルを詊す蚈画がありたす。


N-gramモデルは次のように機胜したす。 モデルのトレヌニングに䜿甚されるテキストによるず、Nワヌドのりィンドりを通過し、各組み合わせが発生した回数nグラムをカりントしたす。 モデルぞの芁求に応じお、提案のりィンドりを同様に通過し、すべおのn-gramの確率の積を考慮したす。 n-gramを満たす可胜性は、トレヌニングテキスト内のそのようなn-gramの数によっお掚定されたす。


m個の単語の文w 1 、...、w m を満たす確率Pw 1 、...、w m は、この文が構成するサむズnのすべおのn-gramの積にほが等しくなりたす。
フォヌミュラ1


各n-gramの確率は、同じn-gramが最埌の単語を陀いお出䌚った回数に察しお、このn-gramが出䌚った回数によっお決定されたす。


匏2


実際には、このようなモデルは次の問題があるため、玔粋な圢では䜿甚されたせん。 䜕らかの皮類のn-gramがトレヌニングテキストで芋぀からない堎合、文党䜓が即座にれロの確率を受け取りたす。 この問題を解決するには、スムヌゞングスムヌゞングのオプションのいずれかを䜿甚したす。 簡単に蚀えば、これは、すべおのn-gramの出珟頻床に単䜍を远加するこずです。より耇雑な圢匏では、高次n-gramがない堎合に䜎次n-gramを䜿甚したす。


最も䞀般的なスムヌゞング手法はKneser – Ney smoothingです。 ただし、n-gramごずに远加の情報を保存する必芁があり、より単玔な平滑化ず比范しおゲむンは匷くありたせん少なくずも、5000侇n-gramたでの小さなモデルの実隓では。 簡単にするために、各n-gramの確率を、すべおの次数のn-gramの積ずしお、たずえば、トラむグラムの堎合の平滑化ず芋なしたす。


フォヌミュラ3


ここで、蚀語モデルを䜜成したら、タむプミスの候補の䞭から、コンテキストを考慮しお蚀語モデルが最高のスコアを䞎える修正を行う候補を遞択したす。 さらに、倚数の誀怜知を回避するために、元の単語を倉曎するための小さなペナルティを評䟡に远加したす。 この眰金を倉曎するず、誀怜知の割合を調敎できたす。たずえば、テキスト゚ディタヌでは、誀怜知の割合を高くし、テキストの自動修正を䜎くするこずができたす。


シンスペル


ノルりェヌ語のスペルチェッカヌの次の問題は、候補者がいない堎合の䜜業速床が遅いこずです。 したがっお、15文字の単語では、アルゎリズムは玄1秒間機胜したすが、このようなパフォヌマンスは実甚に十分ではありたせん。 パフォヌマンスを高速化するためのオプションの1぀はSymSpellアルゎリズムで、著者によれば、これは100䞇倍高速に動䜜したす。 SymSpellは、次の原則に埓っお機胜したす。蟞曞の各単語に぀いお、元の単語を参照しお、削陀が個別のむンデックスに远加されるか、1぀以䞊の文字通垞1および2を削陀するこずで元の単語がすべお取埗されたす。 候補の怜玢時に、単語に察しお同様の削陀が行われ、むンデックス内でのそれらの存圚がチェックされたす。 このようなアルゎリズムは、゚ラヌのすべおのケヌスを正しく凊理したす-文字の眮き換え、再配眮、远加および削陀。


たずえば、眮換を怜蚎したすこの䟋では距離1のみを怜蚎したす。 元の蟞曞に「 test 」ずいう単語を含めたす。 そしお、「 テンポ 」ずいう単語を入力したした。 むンデックスには、「 test 」ずいう単語のすべおの削陀、぀たりeats 、 tst 、 tet 、 tesが含たれたす。 単語「 tempo 」の堎合、削陀はemt 、 tmt 、 tet 、 emtになりたす。 「 tet 」の削陀はむンデックスに含たれおいたす。぀たり、「 test 」ずいう単語は「 temt 」ずいうタむプミスの単語に察応したす。


完党なハッシュ


次の問題はメモリ消費です。 200䞇文のテキストWikipediaから100侇+ニュヌステキストから100䞇でトレヌニングされたモデルは、7 GBのRAMを占有したした。 このボリュヌムの玄半分は蚀語モデル発生頻床のnグラムで䜿甚され、残りの半分はSymSpellのむンデックスで䜿甚されたした。 このようなメモリ消費により、アプリケヌションの䜿甚はあたり実甚的ではなくなりたした。


品質が著しく䜎䞋し始めたため、蟞曞のサむズを瞮小したくありたせんでした。 刀明したように、これは新しい問題ではありたせん。 科孊蚘事では、蚀語モデルによるメモリ消費の問題を解決するさたざたな方法が提案されおいたす。 興味深いアプロヌチの1぀蚘事「 効率的な最小完党ハッシュ蚀語モデル」を参照は、 完党ハッシュ たたはCHDアルゎリズムを䜿甚しおn-gramに関する情報を保存するこずです。 完党ハッシュは、固定デヌタセットに衝突しないハッシュです。 衝突がない堎合、キヌを比范する必芁がないため、キヌを保存する必芁がなくなりたす。 その結果、発生頻床を栌玍するn-gramの数に等しい配列をメモリに保持できたす。 これにより、n-gram自䜓が発生頻床よりもはるかに倚くのスペヌスを占有するため、メモリを倧幅に節玄できたす。


しかし、1぀の問題がありたす。 モデルを䜿甚するず、n-gramが入力されたすが、これはトレヌニングテキストにはありたせん。 その結果、完党なハッシュは、他の既存のn-gramのハッシュを返したす。 この問題を解決するために、この蚘事の著者は、n-gramごずに別のハッシュを保存するこずを提案しおいたす。これにより、n-gramが䞀臎するかどうかを比范できたす。 ハッシュが異なる堎合、このn-gramは存圚しないため、発生頻床はれロず芋なされたす。


たずえば、n1、n2、n3の3぀のn-gramがあり、これらは10、15、および3回出䌚っただけでなく、゜ヌステキストでは発生しなかったn-gram n4もありたす。


n1n2n3n4
完党なハッシュ1021
2番目のハッシュ42132418
頻床101530

発生頻床ず远加のハッシュを保存する配列を䜜成したした。 完党ハッシュの倀を配列のむンデックスずしお䜿甚したす。


15、1310、423、24

n-gram n1を満たすず仮定したす。 その完党ハッシュは1、2番目のハッシュは42です。むンデックス1の配列に移動し、そこにあるハッシュを比范したす。 䞀臎するため、頻床はn-gram 10です。次に、n-gram n4を考えたす。 その完党ハッシュも1ですが、2番目のハッシュは18です。これは、むンデックス1にあるハッシュずは異なりたす。぀たり、発生頻床は0です。


実際には、16ビットのCityHashがハッシュずしお䜿甚されたした。 もちろん、ハッシュは誀怜知を完党に陀倖するわけではありたせんが、最終的な品質指暙に圱響を䞎えないように頻床を枛らしたす。


発生頻床自䜓も、非線圢量子化により、32ビット数から16ビット数たでよりコンパクトに゚ンコヌドされたした。 小さい数字は1〜1、倧きい数字は1〜2、1〜4などに察応しおいたした。再び量子化は最終的なメトリックに圱響したせんでした。


ほずんどの堎合、ハッシュず発生頻床の䞡方をさらに匷力にパッケヌゞ化できたすが、これはすでに次のバヌゞョンに含たれおいたす。 珟圚のバヌゞョンでは、モデルは最倧260 MBたで瞮小したした。品質は䜎䞋せず、10倍以䞊でした。


ブルヌムフィルタヌ


蚀語モデルに加えお、SymSpellアルゎリズムからのむンデックスがただあり、これも倚くのスペヌスを占有したした。 これに぀いおは既成の゜リュヌションがなかったので、もう少し考えなければなりたせんでした。 蚀語モデルのコンパクトな衚珟に関する科孊蚘事では、 ブルヌムフィルタヌがよく䜿甚されたした。 圌はこの仕事を手䌝うこずができるようでした。 ブルヌムフィルタヌを額に盎接適甚するこずはできたせんでした-削陀されたむンデックスからの各単語には、元の単語ぞのリンクが必芁で、ブルヌムフィルタヌは倀の保存を蚱可せず、存圚を確認するだけです。 䞀方、ブルヌムフィルタヌがそのような削陀がむンデックス内にあるこずを瀺しおいる堎合、挿入を実行し、むンデックスでそれらをチェックするこずにより、元の単語を埩元できたす。 SymSpellアルゎリズムの最終的な適応は次のずおりです。


ブルヌムフィルタヌに元の蟞曞から削陀された単語をすべお保存したす。 候補を怜玢する堎合、最初に元の単語から目的の深さたで削陀したすSymSpellず同様。 ただし、SymSpellずは異なり、各削陀の次のステップは、元の蟞曞に結果の単語を挿入しお確認するこずです。 そしお、ブルヌムフィルタヌに保存された削陀のむンデックスは、その䞭にない削陀の挿入をスキップするために䜿甚されたす。 この堎合、誀怜知は私たちを恐れたせん-私たちは少し䜙分な䜜業を行いたす。


結果ずしお埗られる゜リュヌションのパフォヌマンスは実際には䜎䞋せず、䜿甚されるメモリは非垞に倧幅に削枛されたした-最倧140 MB玄25倍。 その結果、合蚈メモリサむズが7 GBから400 MBに削枛されたした。


結果


次の衚は、英語のテキストの結果を瀺しおいたす。 トレヌニングには、りィキペディアからの30䞇文ずニュヌステキストからの30䞇文が䜿甚されたしたテキストはここにありたす 。 最初のサンプルは2぀の郚分に分割され、95がトレヌニングに、5が評䟡に䜿甚されたした。 結果


゚ラヌ䞊䜍7぀の゚ラヌ修正率トップ7修正率壊れたスピヌド
1秒あたりの単語数
ゞャムスペル3.251.2779.5384.100.641833
ノヌビグ7.625.0046.5866.510.69395
ハンスペル13.1010.3347.5268.567.14163
ダミヌ13.1413.140.000.000.00-

JamSpellは、結果のスペルチェッカヌです。 ダミヌ-䜕もしない修正プログラムは、゜ヌステキストの゚ラヌの割合を明確にするために提䟛されたす。 NorvigはPeter Norwigのスペルチェッカヌです。 Hunspellは、最も人気のあるオヌプン゜ヌスのスペルチェッカヌの1぀です。 実隓の玔床を高めるために、文孊テキストのチェックも実斜したした。 「シャヌロックホヌムズの冒険」ずいうテキストのメトリック


゚ラヌ䞊䜍7぀の゚ラヌ修正率トップ7修正率壊れたスピヌド
1秒あたりの単語数
ゞャムスペル3.561.2772.0379.730.501764
ノヌビグ7.605.3035.4356.060.45647
ハンスペル9.366.4439.6165.772.95284
ダミヌ11.1611.160.000.000.00-

JamSpellは、1぀の候補の堎合ず䞊䜍7぀の候補の堎合の䞡方のテストで、HunspellおよびNorwigのスペルチェッカヌに比べお優れた品質ずパフォヌマンスを瀺したした。


次の衚に、さたざたな蚀語およびさたざたなサむズのトレヌニングセットのメトリックを瀺したす。


゚ラヌ䞊䜍7぀の゚ラヌ修正率トップ7修正率壊れたスピヌド蚘憶
英語
30䞇のりィキペディア+ 30䞇のニュヌス
3.251.2779.5384.100.64183386.2 Mb
ロシア語
30䞇のりィキペディア+ 30䞇のニュヌス
4.691.5776.7782.131.071482138.7 Mb
ロシア語
1Mりィキペディア+ 1Mニュヌス
3.761.2280.5685.470.711375341.4 Mb
ドむツ人
30䞇のりィキペディア+ 30䞇のニュヌス
5.502.0270.7675.331.081559189.2 Mb
フランス語
30䞇のりィキペディア+ 30䞇のニュヌス
3.321.2676.5681.250.76154383.9 Mb

たずめ


その結果、同様のオヌプン゜リュヌションを凌ぐ高品質で高速なスペルチェッカヌが実珟したす。 䜿甚䟋は、テキスト゚ディタヌ、メッセンゞャヌ、機械孊習タスクでのダヌティテキストの前凊理などです。


゜ヌスは 、MITラむセンスの䞋でgithubで入手できたす 。 ラむブラリはC ++で蚘述されおおり、swigを介しお他の蚀語のバむンディングを利甚できたす。 Pythonでの䜿甚䟋


import jamspell corrector = jamspell.TSpellCorrector() corrector.LoadLangModel('model_en.bin') corrector.FixFragment('I am the begt spell cherken!') # u'I am the best spell checker!' corrector.GetCandidates(['i', 'am', 'the', 'begt', 'spell', 'cherken'], 3) # (u'best', u'beat', u'belt', u'bet', u'bent', ... ) corrector.GetCandidates(['i', 'am', 'the', 'begt', 'spell', 'cherken'], 5) # (u'checker', u'chicken', u'checked', u'wherein', u'coherent', ...)</td> 

さらなる改善には、蚀語モデルの品質の改善、メモリ消費の削枛、接着ず単語分割の凊理胜力の远加、異なる蚀語の機胜のサポヌトが含たれたす。 誰かがラむブラリの改善に参加したいなら、私はあなたのプルリク゚ストに喜んでいるでしょう。


参照資料




Source: https://habr.com/ru/post/J346618/


All Articles