문장 사이의 구조적 유사성을 어떻게 계산합니까?


12

두 문장이 비슷한 지 여부를 결정 해야하는 문제를 연구 중입니다. 나는 구문 및 의미 론적 유사성을 결정하기 위해 BM25 알고리즘과 wordnet synset을 사용하여 솔루션을 구현했습니다. 해결책은 적절하게 작동하며 문장의 단어 순서가 뒤죽박죽이더라도 두 문장이 유사한 것으로 측정됩니다. 예를 들어

  1. 파이썬은 좋은 언어입니다.
  2. 좋은 파이썬 언어입니다.

내 문제는이 두 문장이 비슷하다는 것을 결정하는 것입니다.

  • 구조적 유사성을위한 가능한 해결책은 무엇입니까?
  • 문장의 구조를 어떻게 유지합니까?

문장 벡터를 사용하여 비교할 수 있습니다.
Aiden Grossman

이 작업에 Gensim ( radimrehurek.com/gensim ) 을 사용하는 것이 좋습니다 . 특히 모델 LSI 및 / 또는 word2vec 및 빠른 텍스트
Robin

답변:


2

일종의 구조적 유사성 측정을 추가하는 가장 쉬운 방법은 n- 그램을 사용하는 것입니다. 귀하의 경우 bigram이 충분할 수 있습니다.

각 문장을 살펴보고 다음과 같은 단어 쌍을 수집하십시오.

  • "파이썬은", "는", "좋은", "좋은 언어"입니다.

다른 문장은

  • "언어 a", "좋은", "좋은 파이썬", "파이썬은"입니다.

8 개의 bigram 중 2 개는 동일합니다 ( "python is"및 "good"). 따라서 구조적 유사성이 2/8이라고 말할 수 있습니다.

물론 두 단어가 의미 적으로 관련되어 있다는 것을 이미 알고 있다면 더욱 유연해질 수 있습니다. 파이썬이 좋은 언어 는 구조적으로 유사하고 자바 와 동일 하다고 말하고 싶다면 , "[PROG_LANG]은 [POSITIVE-ADJ] 언어"를 효과적으로 처리 할 수 ​​있도록 비교에 추가 할 수 있습니다. 또는 비슷한 것.


5

먼저 시작하기 전에 /datascience/25053/best-practical-algorithm-for-sentence-similarityhttps : // stackoverflow 와 같은 네트워크에서 유사한 질문을 참조하는 것이 좋습니다 . com / questions / 62328 / 의미 적 유사성을 나타내는 알고리즘이있다

문장의 유사성을 결정하려면 어떤 종류의 데이터가 있는지 고려해야합니다. 예를 들어, 유사한 문장과 다른 문장과 같이 레이블이 지정된 데이터 세트가있는 경우, 문장을 분류하기 위해 감독 알고리즘을 사용하는 간단한 방법이있을 수 있습니다.

문장 구조적 유사성을 결정할 수있는 접근법은 단어 내장 알고리즘, 즉 word2vec에 의해 생성 된 단어 벡터를 평균화하는 것이다. 이 알고리즘은 각 단어에 대한 벡터를 생성하고 이들 사이의 코사인 유사성은 단어 간의 의미 론적 유사성을 나타냅니다. (Daniel L 2017)

단어 벡터를 사용하여 다음 메트릭을 사용하여 단어의 유사성을 확인할 수 있습니다.

  • 단어의 단어 임베딩 사이의 코사인 거리
  • 단어의 단어 포함 사이의 유클리드 거리

코사인 유사성은 내부 제품 공간의 두 개의 0이 아닌 벡터 사이의 유사도를 측정하여 그 사이의 각도의 코사인을 측정합니다. 코사인 각도는 내용의 관점에서 문장 사이의 겹침을 측정합니다.

두 단어 벡터 사이의 유클리드 거리는 해당 단어의 언어 적 또는 의미 적 유사성을 측정하는 효과적인 방법을 제공합니다. (프랭크 D 2015)

또는 문장의 고유 벡터를 계산하여 문장의 유사성을 결정할 수 있습니다.

고유 벡터는 선형 방정식 시스템 (예 : 행렬 방정식)과 관련된 특수한 벡터 집합입니다. 여기서 문장 유사성 행렬이 각 클러스터에 대해 생성되고 행렬의 고유 벡터가 계산됩니다. 이 논문의 문장 순위에 대한 Eigenvector 기반 접근 방식에 대한 자세한 내용은 https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf를 참조하십시오.

소스 코드의 경우 Siraj Rawal에는 단어 벡터 세트를 작성하기위한 Python 노트북이 있습니다. 그런 다음 단어 벡터를 사용하여 단어 간의 유사성을 찾을 수 있습니다. 소스 코드는 https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE 에서 확인할 수 있습니다

또 다른 옵션은 genrei Python 라이브러리를 사용하여 문서 간의 유사성을 결정하는 Oreily의 튜토리얼입니다. 이 튜토리얼은 NLTK를 사용하여 토큰 화 한 다음 코퍼스에서 tf-idf (term frequency-inverse document frequency) 모델을 만듭니다. 그런 다음 tf-idf를 사용하여 문서의 유사성을 결정합니다. 이 튜토리얼은 https://www.oreilly.com/learning/how-do-i-compare-document-similarity-using-python에 있습니다.


문제에 대한 유용한 정보를 제공해 주셔서 감사합니다. 나는 gensim의 예를 보았지만 질문에서 언급 한 문제를 해결할 수 있을지 의문이 있습니다. 비록 내가 만든 해결책은 문장 사이의 유사성을 찾는 데 잘 작동하지만 단어의 순서가 뒤죽박죽 때 멈추게됩니다.
Shubham Tiwari

4

현재 가장 좋은 방법은 2019 년입니다.

가장 효율적인 방법은 임베딩의 내적 (예 : 215 값의 벡터)을 사용하여 문장 사이의 의미 적 유사성을 계산 하는 Google의 Universal Sentence Encoder ( paper_2018 )를 사용하는 것입니다 . 유사성은 0 (즉, 유사성이 없음) 과 1 (즉, 강한 유사성) 사이의 부동 소수점 수 입니다.

이제 구현이 Tensorflow Hub에 통합되어 쉽게 사용할 수 있습니다. 다음은 두 문장 사이의 유사성을 계산하는 즉시 사용 가능한 코드입니다. 여기서는 "Python is a good language""Language a good python is" 의 유사점을 예로 들겠습니다.

코드 예 :

#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 년의 또 다른 옵션은 BERT 문장 삽입입니다. 여기에서 예제 코드를 볼 수 있습니다 -github.com/hanxiao/bert-as-service
Adnan S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.