怜玢ク゚リのタむプミスを修正したす

おそらく、䞀般的に怜玢を行うサヌビスであれば、遅かれ早かれ、ナヌザヌク゚リの゚ラヌを修正する方法を孊ぶ必芁が生じたす。 人間の゚ラヌ ナヌザヌは垞に封印され、誀解され、怜玢の品質は必然的にこれに苊しみたす-そしお、ナヌザヌ゚クスペリ゚ンスに圱響したす。

さらに、各サヌビスには固有の固有の甚語があり、ボキャブラリヌはタむプミス修正プログラムを操䜜できるはずであり、既存の゜リュヌションの䜿甚を非垞に耇雑にしたす。 たずえば、このようなリク゚ストは、保護者の線集を孊習する必芁がありたした。



ナヌザヌに圌の垂盎珟実の倢を吊定したように思えるかもしれたせんが、実際には、文字Kは文字Uの隣のキヌボヌド䞊に単玔に立っおいたす。

この蚘事では、モデルの䜜成からPythonおよびGoでのコヌドの䜜成たで、タむプミスを修正するための叀兞的なアプロヌチの1぀を分析したす。 ボヌナスずしお-私のレポヌト「 Vertical Vertices」のビデオ Highload ++ での怜玢ク゚リのタむプミスの修正 。

問題の声明


そのため、封印されたリク゚ストを受け取り、それを修正する必芁がありたす。 通垞、問題は次のように数孊的に提起されたす。


このステヌトメント-最も基本的なもの-は、耇数の単語のリク゚ストを受け取った堎合、各単語を個別に修正するこずを瀺唆しおいたす。 もちろん、実際には、隣接する単語の互換性を考慮しお、フレヌズ党䜓を修正する必芁がありたす。 これに぀いおは、「フレヌズを修正する方法」セクションで説明したす。

2぀の䞍明確な瞬間がありたす-蟞曞の入手堎所ずカりント方法 P  w | s  。 最初の質問は簡単ず芋なされたす。 1990 [1]蟞曞は、 スペルナヌティリティデヌタベヌスず電子的に利甚可胜な蟞曞から線集されたした。 2009幎にGoogle [4]を䜿甚するず、むンタヌネット䞊で最も人気のある単語および人気のある぀づりの間違いを簡単に理解できるようになりたした。 私はこのアプロヌチで保護者を䜜りたした。

2番目の質問はより耇雑です。 圌の決定が通垞ベむズの公匏の適甚から始たるずいう理由だけで

P  w | s  = m a t h r m c o n s t c d o t P  s | w  c d o t P  w    




ここで、元の䞍可解な確率の代わりに、2぀の新しい、少し理解しやすいものを評䟡する必芁がありたす。 P  s | w  -単語を入力するずきの確率 w 封印しお埗るこずができたす s 、そしお P  w  -原則ずしお、ナヌザヌが単語を䜿甚する確率 w 。

評䟡する方法 P  s | w   明らかに、ナヌザヌはbをSず比べおAずOを混同する可胜性が高いです。 たた、スキャンしたドキュメントから認識されたテキストを修正するず、rnずmの間で混乱する可胜性が高くなりたす。 䜕らかの方法で、゚ラヌずその確率を蚘述する䜕らかの皮類のモデルが必芁です。

このようなモデルは、ノむズの倚いチャネルモデルノむズの倚いチャネルモデルです。この堎合、ノむズの倚いチャネルは、ナヌザヌのブロックの䞭心から始たり、キヌボヌドの反察偎で終わりたす、たたは簡単に蚀えば、゚ラヌモデルが゚ラヌモデルです。 以䞋の別のセクションで説明するこのモデルは、スペルミスず実際のタむプミスの䞡方を考慮する必芁がありたす。

単語を䜿甚する確率を評䟡- P  w  -それはさたざたな方法で可胜です。 最も単玔なオプションは、テキストのいく぀かの倧きなコヌパスで単語が出珟する頻床を取るこずです。 もちろん、保護者にずっおは、フレヌズのコンテキストを考慮しお、より耇雑なものが必芁です-別のモデル。 このモデルは、蚀語モデル、蚀語モデルず呌ばれたす。

゚ラヌモデル


最初の゚ラヌモデルが考慮されたした P  s | w  、トレヌニングセットの基本的な眮換の確率を蚈算したす。Eの代わりに䜕回曞いたのか、Tの代わりに䜕回Tを曞いたのか、T-Tの代わりに䜕回曞いたのかなど[1]。 その結果、いく぀かのロヌカル効果を孊習できる少数のパラメヌタヌを持぀モデルが䜜成されたしたたずえば、EずIを混同するこずがよくありたす。

私たちの研究では、2000幎にBrillずMooreによっお提案され[2]、埌で再利甚されたたずえばGoogleの専門家[4]によっおより発展した゚ラヌモデルに萜ち着きたした。 ナヌザヌが別々の文字で考えないこずを想像しおくださいEずIを混同し、Yの代わりにKを抌し、゜フト蚘号をスキップしたす。たずえば、TSYAをTYSYAに、YをKに、SHAをSHCHYAに、SSに眮き換えたすCなどに。 ナヌザヌが封印され、TSYAの代わりにTHYず蚘述されおいる確率は、 P textthousand rightarrow textthousand モデルのパラメヌタヌです。 すべおの可胜なフラグメントに぀いお  alpha、 beta、 私たちは数えるこずができたす P\アルファ\右矢印\ベヌタアルファ右矢印ベヌタ 、その埌、所望の確率 Ps|w ブリルアンドムヌアモデルで単語wを入力しようずするずきの単語sのセットは、次のようにしお取埗できたす。 各パヌティションに぀いお、すべおのフラグメントwの確率の積を蚈算しお、察応するフラグメントsにしたす。 このようなすべおのパヌティションの最倧倀は、の倀ずしお取埗されたす Ps|w 

Ps|w= maxs= alpha1 alpha2 ldots alphak、w= beta1 beta2 ldots betakP alpha1 rightarrow beta1 cdotP alpha2 rightarrow beta2 cdot ldots cdotP alphak rightarrow betak ,.

、


「アクセサリ」ではなく「アクセサリ」を印刷する確率を蚈算するずきに発生するパヌティションの䟋を芋おみたしょう。

 beginmatrix textak textcec textsou texta textp downarrow downarrow downarrow downarrow\䞋矢印 texta textcc texte textsoua textp endmatrix

䞋矢印

お気づきかもしれたせんが、これはあたり成功しおいないパヌティションの䟋です。単語の䞀郚が互いに可胜な限りうたく重なり合っおいないこずは明らかです。 数量 P\テキストak\右矢印\テキストaテキスト右矢印テキスト そしお P\テキストp\右矢印\テキストpテキスト右矢印テキスト ただそんなに悪くない P\テキストsou\右矢印\テキストeテキスト右矢印テキスト そしお P\テキストa\右矢印\テキストsouaテキスト右矢印テキスト ほずんどの堎合、このパヌティションの最終的な「スコア」は完党に悲しくなりたす。 より成功したパヌティションは次のようになりたす。

 beginmatrix textak textce textss texty textar downarrow downarrow downarrow downarrow\䞋矢印 textak textce textc texty textar endmatrix

䞋矢印


ここでは、すべおがすぐに所定の䜍眮に萜ち、最終的な確率は䞻に倀によっお決定されるこずは明らかです P\テキストss\右矢印\テキストsテキスト右矢印テキスト 。


蚈算方法 Ps|w


2぀の単語に察しお可胜なパヌティションの順序があるずいう事実にもかかわらず O2|s|+|w| 動的蚈画法蚈算アルゎリズムの䜿甚 Ps|w かなり速くするこずができたす-のために O|s|2|w|2 。 アルゎリズム自䜓は、 レヌベンシュタむン距離を蚈算するためのワヌグナヌ・フィッシャヌアルゎリズムに非垞に䌌おいたす。

行が正しい単語の文字に察応し、列が封印されたものに察応する長方圢のテヌブルを䜜成したす。 アルゎリズムの終わりたでに行iず列jの亀点にあるセルは、 w[:i]を印刷しようずするず、正確にs[:j]を取埗する可胜性がありたす。 それを蚈算するには、前の行ず列のすべおのセルの倀を蚈算し、察応する倀を掛けおそれらを調べるだけで十分です P\アルファ\右矢印\ベヌタ 。 たずえば、テヌブルが埋められおいる堎合


、4番目の行ず3番目の列灰色のセルを塗り぀ぶすには、最倧倀を取埗する必芁がありたす 0.8 cdotP\テキストcc\右矢印\テキストc そしお 0.16 cdotP\テキストc\右矢印\テキストk 。 同時に、写真の緑色で匷調衚瀺されおいるすべおのセルを実行したした。 フォヌムの倉曎も考慮する堎合 P alpha rightarrow text空行 そしお P\テキスト空の行\右矢印\ベヌタ 、黄色で匷調衚瀺されおいるセルを移動する必芁がありたす。

䞊で述べたように、このアルゎリズムの耇雑さは O|s|2|w|2 テヌブルに蚘入したす |s|\回|w| 、必芁なセルi、jを埋める Oi cdotj 操䜜。 ただし、䞀郚の制限された長さ以䞋のフラグメントにのみ考慮を制限する堎合 L たずえば、[4]のように2文字以䞋、耇雑さは次のように枛少したす。 O|s| cdot|w| cdotL2 。 私の実隓でロシア語のために L=3 。


最倧化する方法 Ps|w


私たちは芋぀けるこずを孊びたした Ps|w 倚項匏時間は良いです。 しかし、蟞曞党䜓で最適な単語をすばやく芋぀ける方法を孊ぶ必芁がありたす。 そしお最高は Ps|w 、そしお Pw|s  実際、次のような劥圓な䞊䜍たずえば、ベスト20の単語を取埗すれば十分です。 Ps|w 、それを蚀語モデルに送信しお、最も適切な修正を遞択したす詳现は以䞋を参照。

蟞曞党䜓をすばやく調べる方法を孊習するために、䞊蚘の衚には、共通の接頭蟞を持぀2぀の単語に぀いお倚くの共通点があるこずに泚意しおください。 確かに、「アクセサリ」ずいう単語を修正するずきに、「アクセサリ」ず「アクセサリ」ずいう2぀の語圙の単語を蚘入しようずするず、最初の9行がたったく倉わらないこずに気付くでしょう。 次の2぀の単語の共通プレフィックスが十分に長くなるように蟞曞パスを配眮できれば、倚くの蚈算を節玄できたす。

そしお、できる。 語圙を取り䞊げおトラむしおみたしょう。 深さを芋おいくず、目的のプロパティが埗られたす。ほずんどのステップは、テヌブルから最埌の数行を埋める必芁があるずきに、ノヌドからその子孫たでのステップです。

このアルゎリズムは、いく぀かの远加の最適化により、100ミリ秒以内に兞型的なペヌロッパ蚀語の蟞曞を50〜10䞇語で゜ヌトするこずができたす[2]。 たた、結果をキャッシュするず、プロセスがさらに高速になりたす。


取埗方法 P\アルファ\右矢印\ベヌタ


蚈算 P\アルファ\右矢印\ベヌタ 怜蚎䞭のすべおのフラグメント-゚ラヌモデルを構築する䞊で最も興味深く重芁な郚分。 これらの量から品質が決たりたす。

[2、4]で䜿甚されおいるアプロヌチは比范的単玔です。 たくさんのカップルを芋぀けたしょう si、wi どこで wi 蟞曞からの正しい単語であり、 si -その密封されたバヌゞョン。 正確に芋぀ける方法は少し䜎いです。次に、これらのペアから特定のタむプミスの可胜性を抜出する必芁がありたすあるフラグメントを別のフラグメントに眮き換える。

各ペアに぀いお、そのコンポヌネントを取埗したす w そしお s そしお、文字間の察応を構築し、レヌベンシュタむン距離を最小化したす。

 beginmatrix text text text text text text text texta textp texta textk textc texte textc text texty texta textp endmatrix

これで、眮換がすぐに衚瀺されたす。a→a、e→、c→c、c→空の文字列などです。 たた、2぀以䞊の文字の眮換も確認したす。ak→ak、ce→si、ec→is、ss→s、ses→sis、ess→isおよびその他など。 これらすべおの眮換は、コヌパスに単語sが出珟するたびにカりントする必芁がありたすコヌパスから単語を取埗した堎合、これは非垞に可胜性が高い。

すべおのペアを枡した埌 si、wi 確率のために P\アルファ\右矢印\ベヌタ ペアで発生した眮換の数α→βが受け入れられ察応する単語の発生を考慮しお、フラグメントαの繰り返し数で陀算されたす。

カップルを芋぀ける方法 si、wi  [4]では、そのようなアプロヌチが提案されおいたす。 倧量のナヌザヌ生成コンテンツUGCを取埗したす。 Googleの堎合、それは䜕億ものWebペヌゞのテキストでした。 私たちには䜕癟䞇ものナヌザヌ怜玢ずレビュヌがありたす。 通垞、コヌパス内で゚ラヌのあるバリアントよりも正しい単語が頻繁に芋぀かるず想定されおいたす。 それで、コヌパスのレヌベンシュタむンによるず、それに近い各単語の単語を芋぀けたしょう。 人気を取る w 、あたり人気がない-のために s 。 そのため、ノむズが倚くなりたすが、トレヌニング察象のペアは非垞に倚くなりたす。

このペアマッチングアルゎリズムには、改善の䜙地が倚くありたす。 [4]では、発生によるフィルタヌのみ w 人気の10倍 s 、ただし、この蚘事の著者は、蚀語の先隓的な知識を䜿甚せずにゎシップを䜜成しようずしおいたす。 ロシア語のみを考慮する堎合、たずえば、 ロシア語の単語圢匏の蟞曞のセットを取埗し、単語ずのペアのみを残すこずができたす w 蟞曞にある蟞曞にはサヌビスに固有の語圙が含たれおいない可胜性が高いため、お勧めできたせん、たたは逆に、蟞曞にある単語sずのペアを砎棄したす぀たり、封印されないこずがほが保蚌されたす。

受信したペアの品質を改善するために、ナヌザヌが2぀の単語を同矩語ずしお䜿甚するかどうかを決定する簡単な関数を䜜成したした。 論理は単玔です単語wずsが同じ単語で囲たれおいるこずが倚い堎合、それらはおそらく同矩語です-レヌベンシュタむンによるず、それらの近さを考慮するず、あたり人気のない単語はより人気のある単語の誀ったバヌゞョンである可胜性が高いこずを意味したす。 これらの蚈算では、以䞋の蚀語モデル甚に䜜成されたトラむグラム3語のフレヌズの出珟の統蚈を䜿甚したした。

蚀語モデル


したがっお、指定された蟞曞の単語wに぀いお、蚈算する必芁がありたす Pw -ナヌザヌによる䜿甚の確率。 最も簡単な解決策は、ある皮の倧きなケヌスで単語の出珟を取埗するこずです。 䞀般的に、おそらく、どの蚀語モデルも、テキストの倧きなコヌパスを収集し、その䞭の単語の出珟をカりントするこずから始たりたす。 しかし、これに限定すべきではありたせん。実際、Pwを蚈算するずき、単語を修正しようずしおいるフレヌズやその他の倖郚コンテキストも考慮するこずができたす。 タスクは蚈算タスクに倉わりたす Pw1w2 ldotswk どこの wi -タむプミスを修正し、珟圚カりントしおいる単語 Pw そしお残り wi -ナヌザヌリク゚ストで修正された単語を囲む単語。

それらを考慮に入れる方法を孊ぶには、コヌパスをもう䞀床調べお、n-gram、単語シヌケンスの統蚈をコンパむルする䟡倀がありたす。 通垞、制限された長さのシヌケンスを取りたす。 むンデックスを膚らたさないようにトラむグラムに限定したしたが、それはすべおあなたの心の匷さ次第ですそしおケヌスのサむズ-トラむグラムの統蚈でさえノむズが倚すぎる。

埓来のn-gram蚀語モデルは次のようになりたす。 フレヌズに぀いお w1w2 ldotswk その確率は匏によっお蚈算されたす

Pw1w2 ldotswk=Pw1 cdotPw2|w1 cdotPw3|w1w2Pwk|w1w2wk−1 ,,


どこで Pw1 -盎接単語の頻床、および Pw3|w1w2 -単語の確率 w3 圌が行く前に w1w2 -トラむグラム頻床の比以倖 w1w2w3 バむグラム呚波数ぞ w1w2 。 この匏は、単玔にベむズ匏を繰り返し適甚した結果であるこずに泚意しおください。

぀たり、蚈算したい堎合 P textmomsoapframe の任意のn-gramの頻床を瀺す f 匏を取埗したす

P textmomsoapframe=f textmom cdot fracf textmomsoapf textmom cdot fracf textmomsoapframef textmomsoap=f textmomsoapframe\、。


論理的ですか 論理的です。 ただし、フレヌズが長くなるず困難が始たりたす。 ナヌザヌが印象的な詳现で10語の怜玢ク゚リを入力した堎合はどうなりたすか 10グラムすべおの統蚈を保持する必芁はありたせん。これは高䟡であり、デヌタはノむズが倚く、指暙ではない可胜性がありたす。 いく぀かの制限された長さのn-gram䟋えば、すでに䞊で提案された長さ3でうたく行きたいです。

ここで、䞊蚘の匏が圹立ちたす。 フレヌズの最埌に出珟する単語の確率は、その盎前のわずかな単語だけに倧きく圱響されるず仮定したしょう。぀たり、

Pwk|w1w2 ldotswk−1\箄Pwk|wk−L+1 ldotswk−1\、。


パッティング L=3 、より長いフレヌズの堎合、匏が埗られたす


P\テキスト{carlはClaraからサンゎを盗んだ}\箄f\テキスト{carl}\ cdot \ frac {f\ text {carl}} {f\ text {carl}} \ cdot \ frac {f\ text {claraからのカヌル}} {f\ text {carlからの}} \ cdot \ frac {f\ text {claraからのストヌル}} {f\ text {からのクララ} ïŒ‰} \ cdot \ frac {f\ text {claire stole corole}}} {f\ text {claire stole}} \、。


泚フレヌズは5぀の単語で構成されおいたすが、匏には3぀以䞋のn-gramが衚瀺されたす。 これはたさに私たちが目指しおいたものです。

わずかな瞬間が残りたした。 ナヌザヌが統蚈に非垞に奇劙なフレヌズず察応するn-gramを入力し、たったく入力しなかった堎合はどうなりたすか なじみのないN-gramを眮くのは簡単だろう f=0 この倀で割る必芁がなかった堎合。 ここでは、さたざたな方法で行うこずができるスムヌゞングスムヌゞングに぀いお説明したす。 ただし、 Kneser-Neyの平滑化などの深刻なアンチ゚むリアシングアプロヌチの詳现な説明は、この蚘事の範囲をはるかに超えおいたす。


フレヌズを修正する方法


実装に移る前に、最埌の埮劙な点に぀いお説明したす。 䞊蚘で説明した問題の説明は、1぀の単語があり、修正する必芁があるこずを暗瀺しおいたす。 次に、この1぀の単語が他のいく぀かの単語の䞭でフレヌズの途䞭にある可胜性があり、それらも考慮に入れお最適な修正を遞択する必芁があるこずを明確にしたした。 しかし、実際には、ナヌザヌはどの単語のスペルを指定せずにフレヌズを送信するだけです。 倚くの堎合、いく぀かの単語たたはすべおを修正する必芁がありたす。

倚くのアプロヌチがありたす。 たずえば、フレヌズ内の単語の巊偎のコンテキストのみを考慮するこずができたす。 次に、巊から右の単語に埓っお、必芁に応じお修正するず、新しい品質のフレヌズが埗られたす。 たずえば、最初の単語がいく぀かの䞀般的な単語のようになり、間違ったオプションを遞択した堎合、品質は䜎䞋したす。 フレヌズの残りの郚分おそらく最初は完党に゚ラヌがない堎合は、間違った最初の単語に合わせお調敎され、元のテキストずはたったく関係のないテキストを取埗できたす。

[4]で提案されおいるように、単語を個別に怜蚎し、特定の分類子を適甚しお、特定の単語が封印されおいるかどうかを理解するこずができたす。 分類噚は、カりント方法をすでに知っおいる確率、および他の倚くの機胜に぀いおトレヌニングされおいたす。 分類子が修正する必芁があるこずを瀺しおいる堎合、既存のコンテキストを考慮しお修正したす。 繰り返したすが、耇数の単語のスペルが間違っおいる堎合、゚ラヌのあるコンテキストに基づいお最初の単語に぀いお決定する必芁があり、品質の問題に぀ながる可胜性がありたす。

ガヌディアンの実装では、このアプロヌチを䜿甚したした。 蚀葉ごずにしたしょう si 私たちのフレヌズでは、゚ラヌモデルを䜿甚しお、意味のある䞊䜍N個の蟞曞の単語を芋぀け、考えられるあらゆる方法でそれらをフレヌズに連結したす。 NK 結果のフレヌズ K -元のフレヌズの単語数、倀を正盎に蚈算する

Ps1|w1 cdotPsK|wK cdotPsK|wK cdotPw1w2 ldotswK lambda\、。



ここに si -ナヌザヌが入力した単語、 wi -それらに察しお遞択された修正珟圚、゜ヌト䞭、および \ラムダ -[4]で提案されおいる、゚ラヌモデルず蚀語モデルの比范品質によっお決定される係数倧きな係数-蚀語モデルをより信頌し、小さな係数-゚ラヌモデルをより信頌したす。 党䜓ずしお、各フレヌズに぀いお、察応する蟞曞のバリ゚ヌションで修正される個々の単語の確率を掛け、さらにこれを蚀語のフレヌズ党䜓の確率で掛けたす。 アルゎリズムの結果は、この倀を最倧化する蟞曞の単語からのフレヌズです。

だから䜕を止めたすか ブルヌトフォヌス NK フレヌズ

幞いなこずに、n-gramの長さが制限されおいるずいう事実により、すべおのフレヌズの最倧倀をはるかに高速に芋぀けるこずができたす。 芚えおおいおください䞊蚘の匏を簡略化したした Pw1w2 ldotswK 3以䞋の長さのn-gramの呚波数のみに䟝存するようになりたした。

Pw1w2 ldotswK=Pw1 cdotPw2|w1 cdotPw3|w1w2 cdot ldots cdotPw K | WのK - 2 WのK - 1\、 。


この倀に乗算するず P s i | w i  そしお、最倧化しようずしたす w K 、すべおの皮類を敎理するのに十分であるこずがわかりたす w K - 2 そしお w K - 1 そしお圌らのために問題を解決したす-぀たり、フレヌズのために w 1 w 2 l d o t s w K - 2 w K - 1  。 合蚈するず、問題は動的プログラミングで解決されたす O  K N 3  。

実装


ケヌスをたずめおnグラムを数える


すぐに予玄したす。耇雑なMapReduceを開始するのに十分なデヌタがありたせんでした。 そのため、レビュヌ、コメント、怜玢ク゚リのテキストをすべおロシア語で収集したした商品の説明は悲しいかな、英語で衚瀺され、自動翻蚳の結果の䜿甚は結果を改善するよりもむしろ悪化したしたをサヌビスから1぀のテキストファむルに収集し、カりントするサヌバヌを倜に蚭定したした単玔なPythonスクリプトを䜿甚したトラむグラム。

蟞曞ずしお、頻床の高い䞊䜍の単語を取り䞊げ、玄10䞇語を埗たした。 長すぎる単語20文字以䞊ず短すぎるハヌドコヌドされた有名なロシア語を陀く3文字未満は陀倖されたした。 芏則性r"^[a-z0-9]{2}$"の単語を別にr"^[a-z0-9]{2}$"バヌゞョンず長さ2の他の興味深い識別子が生き残ったように。

フレヌズでバむグラムずトラむグラムを数えるず、蟞曞に茉っおいない単語が発生する堎合がありたす。 この堎合、私はこの単語を捚お、2぀の郚分この単語の前埌でフレヌズ党䜓を叩き、別々に䜜業したした。 それでは、 「abyrvalg」ずは䜕かを知っおいたすか これは... HEADMAN、同僚は 「トラむグラムを考慮に入れたす」知っおいたすか、「」「䜕を知っおいる」、「」「䜕を知っおいる」、そしおこれが持垫の䞻任の同僚ですもちろん、「銖長」ずいう蚀葉が蟞曞に収たらない限り...。

゚ラヌモデルをトレヌニングする


さらに、Jupyterですべおのデヌタ凊理を実行したした。 n-gramの統蚈はJSONから読み蟌たれ、埌凊理が実行されお、Levenshteinに埓っお互いに近い単語をすばやく芋぀けたす。ルヌプ内のペアに぀いおは、単語を配眮し、フォヌムss→sスポむラヌの䞋の短い線集を抜出するやや面倒な関数が呌び出されたす

Pythonコヌド
 def generate_modifications(intended_word, misspelled_word, max_l=2): #         #    .    #     ,  #         # : memo    # i -> j -> (distance, prev i, prev j). #     Python  -   # ,      ! m, n = len(intended_word), len(misspelled_word) memo = [[None] * (n+1) for _ in range(m+1)] memo[0] = [(j, (0 if j > 0 else -1), j-1) for j in range(n+1)] for i in range(m + 1): memo[i][0] = i, i-1, (0 if i > 0 else -1) for j in range(1, n + 1): for i in range(1, m + 1): if intended_word[i-1] == misspelled_word[j-1]: memo[i][j] = memo[i-1][j-1][0], i-1, j-1 else: best = min( (memo[i-1][j][0], i-1, j), (memo[i][j-1][0], i, j-1), (memo[i-1][j-1][0], i-1, j-1), ) #      #   (   # ). if (i > 1 and j > 1 and intended_word[i-1] == misspelled_word[j-2] and intended_word[i-2] == misspelled_word[j-1] ): best = min(best, (memo[i-2][j-2][0], i-2, j-2)) memo[i][j] = 1 + best[0], best[1], best[2] #          #   memo[m][n][0]. #     . s, t = [], [] i, j = m, n while i >= 1 or j >= 1: _, pi, pj = memo[i][j] di, dj = i - pi, j - pj if di == dj == 1: s.append(intended_word[i-1]) t.append(misspelled_word[j-1]) if di == dj == 2: s.append(intended_word[i-1]) s.append(intended_word[i-2]) t.append(misspelled_word[j-1]) t.append(misspelled_word[j-2]) if 1 == di > dj == 0: s.append(intended_word[i-1]) t.append("") if 1 == dj > di == 0: s.append("") t.append(misspelled_word[j-1]) i, j = pi, pj s.reverse() t.reverse() #      . for i, _ in enumerate(s): ss = ts = "" while len(ss) < max_l and i < len(s): ss += s[i] ts += t[i] yield ss, ts i += 1 


線集の蚈算自䜓は基本的に芋えたすが、時間がかかる堎合がありたす。


゚ラヌモデルを適甚する


この郚分は、Goのマむクロサヌビスずしお実装され、gRPCを介しおメむンバック゚ンドに接続されたす。 BrillずMoore自身によっお蚘述されたアルゎリズム[2]が、わずかな最適化ずずもに実装されたした。 その結果、著者の䞻匵の玄2倍の速床で動䜜したす。 Goか私かを刀断する勇気はありたせん。 しかし、プロファむリングの過皋で、Goに぀いお少し新しいこずを孊びたした。


蚀語モデルを適甚する


ここでは、驚くこずなく、䞊蚘のセクションで説明した動的プログラミングアルゎリズムが実装されたした。 このコンポヌネントの䜜業は最も少なく、最も遅い郚分ぱラヌモデルの適甚です。 したがっお、これらの2぀のレむダヌ間では、Redisでの゚ラヌモデルの結果のキャッシュがさらにねじ蟌たれたした。

結果


この䜜業の結果玄1か月かかりたしたに基づいお、ナヌザヌにA / Bテストガヌドを実斜したした。ガヌディアンの導入前にあったすべおの怜玢ク゚リのうち、空の怜玢結果の10の代わりに、それらの5がありたした。基本的に、残りのリク゚ストはプラットフォヌム䞊にない商品に察するものです。2番目の怜玢ク゚リのないセッションの数も増加したしたそしおこの皮のUXに関連するいく぀かのメトリック。ただし、金に関連するメトリックは倧きく倉化したせんでした。これは予想倖のこずであり、他のメトリックの培底的な分析ずダブルチェックに぀ながりたした。

おわりに


スティヌブン・ホヌキングはか぀お圌が本に含めたすべおの匏が読者の数を半分にするだろうず蚀われたした。さお、この蚘事には玄50人がいたす-おめでずうございたす10 - 10読者はこの堎所に行きたす

ボヌナス



参照資料


[1]ワシントン州ゲヌル、KW教䌚のMDカヌニガン。ノむズの倚いチャネルモデルに基づくスペル修正プログラム。第13回蚈算蚀語孊に関する䌚議の議事録-1990幎第2巻。

[2] E.Brill、RCムヌア。雑音の倚いチャンネルスペル蚂正のための改良された゚ラヌモデル。第38回蚈算蚀語孊協䌚に関する第38回幎次䌚議の議事録、2000

。機械翻蚳における倧蚀語モデル。自然蚀語凊理の経隓的方法に関する2007幎䌚議の議事録。

[4] C.ホワむトロヌ、B。ハッチン゜ン、GYチョン、G。゚リス。蚀語に䟝存しないスペルチェックず自動修正のためのWebの䜿甚。2009幎自然蚀語凊理の経隓的方法に関する䌚議の議事録第2巻。

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


All Articles