web-dev-qa-db-ja.com

二つの文の間の不思議な類似性

en_core_web_lgモデルをダウンロードし、2つの文の類似性を見つけようとしています。

nlp = spacy.load('en_core_web_lg')

search_doc = nlp("This was very strange argument between american and british person")

main_doc = nlp("He was from Japan, but a true English gentleman in my eyes, and another one of the reasons as to why I liked going to school.")

print(main_doc.similarity(search_doc))

これは非常に奇妙な値を返します:

0.9066019751888448

これらの2つの文は90%類似であってはなりません。意味はまったく異なります。

なぜこれが起こっているのですか?類似性の結果をより合理的にするために、ある種の追加の語彙を追加する必要がありますか?

7
Mr.D

Spacy documentation ベクトルの類似性は、その基本的な考え方を説明しています:
各Wordには、コンテキストの埋め込み( Word2Vec )によって学習されるベクトル表現があり、ドキュメントで説明されているように、コーパスでトレーニングされます。

現在、フルセンテンスのWord埋め込みは、単にすべての異なる単語の平均です。意味的に同じ領域にある多くの単語(たとえば、 "he"、 "was"、 "this"などのフィラー単語)と追加の語彙 "cancels out"がある場合、あなたの場合に見られるように類似性で終わるかもしれません。

質問はあなたがそれについて何ができるかということです。私の観点からは、より複雑な類似性の尺度を思いつくことができます。 search_docおよびmain_doc元の文のような追加情報がある場合、長さの差のペナルティによってベクトルを変更するか、文の短い部分を比較して、ペアワイズの類似性を計算できます(それから、質問はどの部分を比較するかです) 。

現時点では、残念ながらこの問題を単純に解決する明確な方法はありません。

7
dennlinger

Spacyは、Wordの埋め込みを平均化することにより、文の埋め込みを構築します。通常の文には、無意味な単語( stop words と呼ばれる)がたくさんあるため、結果は良くありません。次のように削除できます。

search_doc = nlp("This was very strange argument between american and british person")
main_doc = nlp("He was from Japan, but a true English gentleman in my eyes, and another one of the reasons as to why I liked going to school.")

search_doc_no_stop_words = nlp(' '.join([str(t) for t in search_doc if not t.is_stop]))
main_doc_no_stop_words = nlp(' '.join([str(t) for t in main_doc if not t.is_stop]))

print(search_doc_no_stop_words.similarity(main_doc_no_stop_words))

または、最も情報の多い名詞のみを保持します。

doc_nouns = nlp(' '.join([str(t) for t in doc if t.pos_ in ['NOUN', 'PROPN']))
10
Johannes Filter

@dennlingerが指摘したように、Spacyの文の埋め込みは、個別に取得されたすべてのWordベクトル埋め込みの平均です。したがって、「good」や「bad」などの否定語を含む文がある場合、それらのベクトルは互いに打ち消し合い、あまり良いコンテキスト埋め込みができなくなる可能性があります。ユースケースが文の埋め込みを取得するために特定されている場合は、SOTAアプローチの下で試してみてください。

  1. Googleのユニバーサルセンテンスエンコーダー: https://tfhub.dev/google/universal-sentence-encoder/2

  2. FacebookのInfersentエンコーダー: https://github.com/facebookresearch/InferSent

これらの埋め込みの両方を試してみましたが、ほとんどの場合は良い結果が得られ、Word埋め込みを使用して文の埋め込みを構築することができます。

乾杯!

1