文間の構造的類似性を計算するにはどうすればよいですか?


12

2つの文が類似しているかどうかを判断する必要がある問題に取り組んでいます。BM25アルゴリズムとワードネットシンセットを使用して、構文と意味の類似性を判断するソリューションを実装しました。解決策は適切に機能しており、文章内の単語の順序が乱雑であっても、2つの文章が類似していることを測定しています。例えば

  1. Pythonは優れた言語です。
  2. 良いpythonは言語です。

私の問題は、これらの2つの文が類似していると判断することです。

  • 構造的類似性の可能な解決策は何でしょうか?
  • 文章の構造をどのように維持しますか?

文ベクトルを使用して比較できる場合があります。
エイデングロスマン

このタスクにはGensim(radimrehurek.com/gensim)を使用することを強くお勧めします。特にモデルLSIおよび/またはword2vecおよびfasttext
ロビン

回答:


2

何らかの構造的類似性尺度を追加する最も簡単な方法は、n-gramを使用することです。あなたの場合、バイグラムで十分かもしれません。

各文を調べて、次のような単語のペアを収集します。

  • 「python is」、「is a」、「a good」、「good language」。

あなたの他の文は

  • 「言語a」、「a good」、「good python」、「python is」。

8つのバイグラムのうち、2つが同じ(「python is」と「a good」)であるため、構造的な類似性は2/8であると言えます。

もちろん、2つの単語が意味的に関連していることを既に知っている場合は、より柔軟にすることもできます。Pythonが優れた言語であると言いたい場合構造的にJavaと似ている/同一であるJavaは優れた言語である場合、それを比較に追加して、「[PROG_LANG]は[POSITIVE-ADJ]言語」を効果的に処理できます。または類似のもの。


5

我々が開始する前にまず、私はあなたのようなネットワーク上の同様の質問を参照することをお勧めします/datascience/25053/best-practical-algorithm-for-sentence-similarityhttps://でのstackoverflow。 com / questions / 62328 / is-there-an-algorithm-that-tells-the-semantic-similarity-of-two-phrases

文の類似性を判断するには、どのようなデータがあるかを考慮する必要があります。たとえば、ラベル付きデータセット、つまり類似の文と類似の文がある場合、直接的なアプローチは、教師ありアルゴリズムを使用して文を分類することでした。

文の構造的類似性を判断できるアプローチは、単語埋め込みアルゴリズム、つまりword2vecによって生成された単語ベクトルを平均化することです。これらのアルゴリズムは各単語のベクトルを作成し、それらの間のコサイン類似性は単語間の意味的類似性を表します。(ダニエルL 2017)

単語ベクトルを使用すると、次のメトリックを使用して単語の類似性を判断できます。

  • 単語の単語埋め込み間の余弦距離
  • 単語の単語埋め込み間のユークリッド距離

コサイン類似度は、内積空間の2つの非ゼロベクトル間の類似度の尺度であり、ベクトル間の角度のコサインを測定します。コサイン角は、内容の観点から見た文間の重なりの尺度です。

2つの単語ベクトル間のユークリッド距離は、対応する単語の言語的または意味的な類似性を測定するための効果的な方法を提供します。(フランクD 2015)

あるいは、文の固有ベクトルを計算して、文の類似性を判断することもできます。

固有ベクトルは、線形連立方程式(行列方程式)に関連付けられたベクトルの特別なセットです。ここでは、各クラスターに対して文の類似性マトリックスが生成され、マトリックスの固有ベクトルが計算されます。Eigenvectorベースの文章ランキングへのアプローチの詳細については、このペーパーhttps://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdfをご覧ください。

ソースコードの場合、Siraj Rawalには、単語ベクトルのセットを作成するPythonノートブックがあります。単語ベクトルを使用して、単語間の類似性を見つけることができます。ソースコードはこちらから入手できますhttps://github.com/llSourcell/word_vectors_game_of_thrones-LIVE

別のオプションは、ドキュメント間の類似性を判断するためにgensin Pythonライブラリを利用するOreilyのチュートリアルです。このチュートリアルでは、NLTKを使用してトークン化を行い、コーパスからtf-idf(頻度逆ドキュメント頻度)モデルを作成します。次に、tf-idfを使用して、ドキュメントの類似性を判断します。チュートリアルはこちらから入手できますhttps://www.oreilly.com/learning/how-do-i-compare-document-similarity-using-python


問題の貴重な詳細をご提供いただきありがとうございます。私はgensimの例を見てきましたが、質問で言及した問題を解決できるかどうか疑問があります。私が作成したソリューションは、文間の類似性を見つけるのにうまく機能していますが、単語の順序が乱れると行き詰まります。
シュバハムティワリ

4

現時点での最善のアプローチ(2019):

最も効率的なアプローチは、今使用しているGoogleがユニバーサル文エンコーダをpaper_2018その埋め込みの内積を使って文章間の意味的な類似性を計算)(すなわち215個の値のベクトルを学んだが)。類似性は、0 (つまり、類似性なし)から1 (つまり、強い類似性)までの浮動小数点数です。

実装は現在Tensorflow Hubに統合されており、簡単に使用できます。これは、2つの文の類似性を計算するためのすぐに使用できるコードです。ここでは、例のように「Pythonは良い言語です」「言語は良いPythonです」の類似性を取得します。

コード例:

#Requirements: Tensorflow>=1.7 tensorflow-hub numpy

import tensorflow as tf
import tensorflow_hub as hub
import numpy as np

module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/3" 
embed = hub.Module(module_url)
sentences = ["Python is a good language","Language a good python is"]

similarity_input_placeholder = tf.placeholder(tf.string, shape=(None))
similarity_sentences_encodings = embed(similarity_input_placeholder)

with tf.Session() as session:
  session.run(tf.global_variables_initializer())
  session.run(tf.tables_initializer())
  sentences_embeddings = session.run(similarity_sentences_encodings, feed_dict={similarity_input_placeholder: sentences})
  similarity = np.inner(sentences_embeddings[0], sentences_embeddings[1])
  print("Similarity is %s" % similarity)

出力:

Similarity is 0.90007496 #Strong similarity

2019年のもう1つのオプションはBERT文の埋め込みです。サンプルコードはこちらからご覧いただけます-github.com/hanxiao/bert-as-service
Adnan S
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.