私は (フランス語のコーパスで) テキスト分類の問題に取り組んでおり、さまざまな Word Embeddings を試しています。私は ConceptNet が提供するものに非常に興味があったので、試してみることにしました。
私は自分の特定のタスクに特化したチュートリアルを見つけることができなかったので、彼らのブログからアドバイスを受けました:
ConceptNet Numberbatch の使用方法を教えてください。
できるだけ簡単にするには:
セマンティック ベクトルを使用する NLP の機械学習に関する任意のチュートリアルに取り組みます。word2vec を使用するように指示されている部分に移動します。(特に詳しいチュートリアルでは、GloVe 1.2 を使用するように指示される場合があります。)
ConceptNet Numberbatch データを取得し、代わりに使用します。他の言語にも一般化されるより良い結果を取得します。
以下に私のアプローチを示します (「numberbatch.txt」は、推奨される多言語バージョンを含むファイルであることに注意してください: ConceptNet Numberbatch 19.08):
embeddings_index = dict()
f = open('numberbatch.txt')
for line in f:
values = line.split()
word = values[0]
coefs = asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Loaded %s word vectors.' % len(embeddings_index))
単語が存在するかどうかをテストすることから始めました。
word = 'fille'
missingWords = 0
if word not in embeddings_index:
missingWords += 1
print(missingWords)
「 fille」(フランス語で女の子)のような簡単な単語が見つからないことに驚きました。次に、コーパスからすべての OOV 単語を出力する関数を作成しました。結果を分析すると、さらに驚きました: 22,000 を超える単語が見つかりませんでした (「nous」(私たち)、「être」(~になる) などの単語を含む)。
OOV ワードのGitHub ページで提案されているアプローチも試しました(結果は同じです)。
語彙外戦略
ConceptNet Numberbatch は、なじみのない単語が存在する場合のパフォーマンスを向上させる語彙外戦略で評価されます。この戦略は、ConceptNet コード ベースに実装されています。次のように要約できます。
言語が英語ではない未知の単語が与えられた場合、英語の埋め込みで同等のスペルの単語を検索してみてください (英語の単語はすべての言語のテキストに含まれる傾向があるため)。
未知の単語が与えられた場合、末尾から文字を削除し、それが既知の単語の接頭辞かどうかを確認します。もしそうなら、それらの既知の単語の埋め込みを平均します。
プレフィックスがまだ不明な場合は、既知のプレフィックスが見つかるまで末尾から文字を削除し続けます。1文字残ったらギブアップ。
私のアプローチで何か間違ったことをしていますか?