タイプミスの修正、側面図

ファッショナブルな「Word埋め込み」を意図された目的ではなく、つまりタイプミス(厳密に言えば間違いも修正しますが、人々は読み書きができ、封印されていると仮定します)の使用について説明します。 ハブに関するかなり近い記事がありましたが、ここでは他のことについて少し説明します。





学生が取得したWord2Vecモデルの視覚化。 彼女はロードオブザリングで学びました。 明らかに、黒い方言の何か。



問題の声明



指定 :辞書(多くの単語)。

必要 :タイプミスのある入力語(辞書にない場合もある)について、事前定義されたメトリックに基づいて、辞書から最も近い語を見つけます。 これらの見つかった単語は、入力単語を修正するためのオプションです。



理論教育プログラム



私たちのタスクには、Word Embedding、または単語のベクトル表現が必要です(ロシア語を話すコミュニティの用語の翻訳についてはまだ疑問があります)。また、ハブについては、それについてよく語るすばらしい記事があります。 繰り返さないために、リンクを介して読者を追いかけないために-トピックへの短い脱線。



単語の埋め込みは単語のベクトル表現です。つまり、固定次元ベクトルは、たとえば条件付き単語「home」- [0.1, 0.3, ..., 0.7]



1つの単語にマッピングされます。 重要な注意:通常、ベクトルの次元はディクショナリの次元よりもはるかに小さく、それ以外の場合は、 ワンホットエンコーディングに縮退します 。



ベクトル要素の数は、選択した方法、問題の要件、クラスノヤルスクの天気など、多くの条件に依存します。 現在のSotA実装では、これらは100〜500の値(通常は300)です。



学習プロセスでベクトルが取得されます。このために、テキスト(フィクションからウィキペディアダンプまで)がアルゴリズムに送られ、各単語に対してベクトルが繰り返し計算されます。



これらのベクトルを取得するにはさまざまな方法がありますが、現在最も人気のあるのはWord2Vec 、 GloVe 、 WordRankおよびFastTextです。



要するに、この考え方は、文脈が似ている言葉-おそらく似た意味を持つ言葉に基づいています。 最初の例でのタイプミスの修正方法に従います。 つまり、「例外のあるツアーを見つける」と「例外のあるツアーを見つける」という2つの文があり、コンテキストが似ているため、「切り替え」と「冒険」という言葉の意味は似ています(これは大まかな近似ですが、意味は)



このタイプミス修正のアプローチには、明らかな利点に加えて、1つの重要な欠点があります。修正できるすべてのエラーオプションは、トレーニング対象のテキストに記載する必要があります。 つまり、今まで見たことのない単語のベクトルを取得することはできません。



FastTextを除く、すべての(著者に知られている)単語ベクトルを取得する最新の方法は、分割不可能なエンティティとして単語を操作します(単語は整数インデックスに置き換えられ、インデックスを操作します)。 FastTextに興味深い文が追加されました(より正確には、 補足で )。これらのベクトルを単語全体ではなく、nグラムの文字について考えてみましょう。 たとえば、「table」という単語(「<table>」のように単語の先頭と末尾に文字を追加)は、次のリストに変換されます。3-grams:<st、100、tol、ol>; 4グラム:<100、テーブル、tol>。 著者は、3〜6のn-gramを使用することを提案していますが、それらについては議論しません。 次に、結果の単語のベクトルは、そのn-gramのベクトルの合計に等しくなります。







V= sumg inGzg、







どこで

G -単語のすべてのn-gramのセット、

zg 対応するn-gramのベクトル、

V 単語ベクトルです。



このアプローチはどのような重要な変更を約束しますか?



まず、著者はこれを導入して、形態が豊富な言語(ロシア語)でより適切に動作するようにしました。 実際、形態の変化は単語間の距離への影響が少なくなりました。ここに、同じ記事の異なる言語のプルーフとしてのプレートがあります。

言語 データセット Sg CBOW sisg- sisg
Ar WS353 51 52 54 55
で Gur350 61 62 64 70
で Gur65 78 78 81 81
で ZG222 35 38 41 44
En Rw 43 43 46 47
En WS353 72 73 71 71
エス WS353 57 58 58 59
Fr Rg65 70 69 75 75
ろ WS353 48 52 51 54
る Hj 59 60 60 66


専門家の判断とメソッドの判断の相関。 SGとCBOWは、それぞれスキップグラムと連続した単語の袋、Word2Vecのバリアント、未知の単語をゼロベクトルに置き換えるときのsisg-未知の単語をそれらのnグラムの合計に置き換えるときのsisgです。



第二に、これは少し後戻りです。Word2Vecでは、「王」と「王」、「母」と「息子」などの言葉を表現しようとして、単語の文字表現から離れ、「リテラルプロキシミティ」に戻ります。セマンティックタスクはあまり良くないかもしれませんが、私たちのオプション(私は覚えています-タイプミス修正)はこれが必要なものです。



これで理論的な部分は終了しました。実践に移りましょう。



実践訓練場



いくつかの前提条件を紹介します。



  1. テストでは、比較的小さなテキスト、つまりショロホフの「Quiet Flows the Don」などのフィクションを使用します。 なぜそう 興味のある読者に繰り返すのが簡単になり、作業のコンテキストを理解して、メソッドの動作を説明できます。 一般に、単語のベクトル表現は、Wikipediaダンプなどの大きな言語本体で教えられます。
  2. 学習する前に単語を正規化します。つまり、単語を通常の形にします(たとえば、名詞の場合、これは単数形で主格です)。 これは、語尾を混乱させずに、より適切なベクトルの単語の出現頻度を増やすための非常に単純化です(これは、まず、大規模なケースで各単語をできるだけ多く使用することを最初に教えます)。


実装



テストコードは非常に単純です(おかげで、 gensim )、スクリプト全体がここにあり、モデルを1行で直接トレーニングします。



 model = gensim.models.FastText(sentences, size=300, window=3, min_count=2, sg=1, iter=35)
      
      





少し説明:

センテンス -リストのリスト。各要素はセンテンス、センテンスの各要素は単語です。

size-出力ベクトルのサイズ。

window-ウィンドウサイズ。 ウィンドウ内の単語は中央の単語のコンテキストと見なされます。

min_count-少なくとも2回出現する単語のみを考慮します。

sg -CBOWではなくskip-gramオプションを使用します。

iterは反復回数です。









さらに、デフォルトで残されている2つのパラメーターがあり、それらの意味は上記で説明されていますが、それらで遊ぶことができます: min_nおよびmax_nは、n-gramが取る下限および上限しきい値です(デフォルトでは、3から6文字)









類似度



メトリックとして、 コサイン類似性ベクトル間の類似性の測定を行います。これは、この問題ですでに古典的になりました。0〜1の値を取ります。0は完全に異なるベクトル、1は同じベクトルです。









類似度=cos( theta)= fracA cdotB parallelA parallel parallelB parallel= frac sumi=1nAiBi sqrt sumi=1nAi2 sqrt sumi=1nBi2







どこで Ai そして Bi 対応するベクトルのコンポーネントです。



実験



それで、念のために、持っているものと欲しいものを見つけました。









  1. 仮説は、単語のベクトル表現に基づいて、タイプミスを修正できるというものです。
  2. FastTextでトレーニングされたモデルはたった1つの作業で作成され、その中の単語は正規化され、未知の単語のベクトルも取得できます。
  3. 単語、またはむしろそれらのベクトルを比較する方法は、前の段落で定義されています。


取得したものを見てみましょう。テストのために、次のペアを取ります-スペルの間違った単語と括弧内の想像された単語:

男性(男性)、スツール(学生)、学生(学生)、chilovnenche(人間性)、参加(参加)、タクト(戦術)、一般(一般)、simpotichny(かなり)、作成(作成)、監視(監視)、アルゴリズム(アルゴリズム)、レイダウン(プット)。









結果を含む要約表:

スペルミスの単語 想像された言葉 最寄りのリストの番号 メトリック値
男 人 1 0.88227
スツール 学生 10 0.67878
学生 学生 1 0.85078
寒気 人類 1 0.75012
参加する 参加する 6 0.87767
タクト 戦術 2 0.73543
一般的に 一般的に (1) 0.96243
きれいな きれいな (1) 0.92399
作成する する 2 0.91553
見る 見る 1 0.80055
アルゴリズム アルゴリズム (1) 0.86162
横たわる 置く 10 0.81719


備考:



  1. 数字が括弧で示されている場合、これは単語が辞書にないことを意味しますが、その場所にある可能性があります(メトリックに基づいて)。
  2. 実際には、上記の言葉は「折り畳む」、「脇に置く」、「レイアウトする」などであるため、一対のレイダウンでは、すべてがそれほど悪くはありません。 (ネタバレ参照)。
  3. 時々、類似した単語の上部にクエリとは非常に異なる単語があります(スツール-ドライバー)。これはおそらく、ベクトルの衝突の一種によるものです-異なるn-gramに対してほぼ同じベクトルが得られる場合。


それぞれの上位10語
人:

人0.87035

チャルバ0.80893

ヒト0.77607

0.74867を確認

世紀0.71127

シャトル0.68631

人間0.63725

人類0.63615

孫0.59655

ミツバチ0.59173




スツール:

椅子0.73342

椅子0.70797

タープ0.67196

ノッカー0.64903

ツール0.64340

財団0.61881

ドライバー0.60767

ブリッジ0.60279

シープスキンコート0.60249

リール0.59757

学生0.58953




学生:

学生0.85685

若々しい0.75904

重い0.72052

化学物質0.71119

青年期0.70076

ヒステリック0.69888

物理的な0.69580

ボーイッシュな0.68713

リン酸0.68312

0.68136のすべての種類




chiさ:

人類0.75012

率直さ0.74727

無価値0.72961

近接0.72873

制限0.72581

値0.72350

co病者0.72186

あいまいさ0.72128

妊娠0.72121

関連性0.72100




参加するには:

こんにちは0.93609

0.89396の大暴れ

辛抱強く0.89216

不幸0.88620

栄光の0.87975

参加する0.87767

横行0.87446

酔う0.86810

0.86627を感じる

0.86622に同情




タクト:

0.87537を測定

戦術0.73542

スツール0.66532

ラベル0.65750

癬0.65702

ブラシ0.64602

アニュトカ0.64291

グリル0.62549

タカ0.62321

たたみ込み0.61241




一般的に:

メッセージ0.57405

武装0.51535

わずかな0.50341

武装した0.49465

非武装の0.48958

通信0.48076

寮0.48069

旅行0.47493

重要でない0.46655

レポート0.46373




かなり:

個人0.86102

通り0.84662

エネルギッシュな0.83907

シニカル0.82305

優れた0.81775

典型的な0.80783

工場0.80701

卵0.80283

セカンダリ0.79368

how弾砲0.77946




作成する:

0.93598を行う

0.91553を作る

0.90678を行う

0.87672を作る

未完成0.87297

トリム0.85775

クローズアップ0.84235

欲望0.82316

0.78098を行う

0.77232を行う




参照:

0.80055を見る

0.78115を参照

0.77926を検査

3番目の0.73819

ビュー0.716420

0.71075を検討する

風化0.68950

ピア0.68513

dazzle 0.65353

0.65069を見てください




アルゴリズム:

リズム0.85291

ライトシーズン0.69376

レギンス0.66552

シニシズム0.66278

愚かな0.65656

しょうりん0.65496

バリトン0.64623

frashenbruder 0.64395

止血帯0.63321

トレリス0.63161




横たわる:

投資0.89386

0.89129を置く

オーバーレイ0.87222

0.87199のレイアウト

0.84127取っておきます

0.83720を破棄

0.83572を置く

0.83549を追加

0.82764を課す

0.81718を入れる






おわりに



ベクトル表現の使用は、間違いなくタイプミス/エラーを修正するのに役立ちますが、時には(まれではありますが)強力なエラーが発生するため、単独で使用することは非常に危険です。







実際、これは、類似性について2つのラインを比較するための別のメトリックですが、たとえば、同じDamerau-Levenshtein distanceよりもすでに高いレベルにあります。 他の方法への追加としてFastTextを使用すると、タイプミス修正の品質が非常に向上する場合があります。



All Articles