ファッショナブルな「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のベクトルの合計に等しくなります。
どこで
-単語のすべてのn-gramのセット、
対応するn-gramのベクトル、
単語ベクトルです。
このアプローチはどのような重要な変更を約束しますか?
まず、著者はこれを導入して、形態が豊富な言語(ロシア語)でより適切に動作するようにしました。 実際、形態の変化は単語間の距離への影響が少なくなりました。ここに、同じ
記事の異なる言語のプルーフとしてのプレートがあります。
言語 | データセット | 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では、「王」と「王」、「母」と「息子」などの言葉を表現しようとして、単語の文字表現から離れ、「リテラルプロキシミティ」に戻ります。セマンティックタスクは
あまり良くないかもしれ
ませんが、私たちのオプション(私は覚えています-タイプミス修正)はこれが必要なものです。
これで理論的な部分は終了しました。実践に移りましょう。
実践訓練場
いくつかの前提条件を紹介します。
- テストでは、比較的小さなテキスト、つまりショロホフの「Quiet Flows the Don」などのフィクションを使用します。 なぜそう 興味のある読者に繰り返すのが簡単になり、作業のコンテキストを理解して、メソッドの動作を説明できます。 一般に、単語のベクトル表現は、Wikipediaダンプなどの大きな言語本体で教えられます。
- 学習する前に単語を正規化します。つまり、単語を通常の形にします(たとえば、名詞の場合、これは単数形で主格です)。 これは、語尾を混乱させずに、より適切なベクトルの単語の出現頻度を増やすための非常に単純化です(これは、まず、大規模なケースで各単語をできるだけ多く使用することを最初に教えます)。
実装
テストコードは非常に単純です(おかげで、
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は同じベクトルです。
どこで そして 対応するベクトルのコンポーネントです。実験
それで、念のために、持っているものと欲しいものを見つけました。
- 仮説は、単語のベクトル表現に基づいて、タイプミスを修正できるというものです。
- FastTextでトレーニングされたモデルはたった1つの作業で作成され、その中の単語は正規化され、未知の単語のベクトルも取得できます。
- 単語、またはむしろそれらのベクトルを比較する方法は、前の段落で定義されています。
取得したものを見てみましょう。テストのために、次のペアを取ります-スペルの間違った単語と括弧内の想像された単語:
男性(男性)、スツール(学生)、学生(学生)、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 |
備考:
- 数字が括弧で示されている場合、これは単語が辞書にないことを意味しますが、その場所にある可能性があります(メトリックに基づいて)。
- 実際には、上記の言葉は「折り畳む」、「脇に置く」、「レイアウトする」などであるため、一対のレイダウンでは、すべてがそれほど悪くはありません。 (ネタバレ参照)。
- 時々、類似した単語の上部にクエリとは非常に異なる単語があります(スツール-ドライバー)。これはおそらく、ベクトルの衝突の一種によるものです-異なる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を使用すると、タイプミス修正の品質が非常に向上する場合があります。