Làm thế nào để tôi tính toán sự tương tự về cấu trúc giữa các câu?


12

Tôi đang làm việc về một vấn đề mà tôi cần xác định xem hai câu có giống nhau hay không. Tôi đã triển khai một giải pháp sử dụng thuật toán BM25 và đồng bộ wordnet để xác định độ tương tự cú pháp và ngữ nghĩa. Giải pháp đang hoạt động đầy đủ, và ngay cả khi thứ tự từ trong các câu bị xáo trộn, nó đang đo rằng hai câu tương tự nhau. Ví dụ

  1. Python là một ngôn ngữ tốt.
  2. Ngôn ngữ một con trăn tốt là.

Vấn đề của tôi là xác định rằng hai câu này là tương tự nhau.

  • Điều gì có thể là giải pháp có thể cho sự tương tự cấu trúc?
  • Làm thế nào tôi sẽ duy trì cấu trúc của câu?

Bạn có thể sử dụng các vectơ câu và so sánh chúng.
Aiden Grossman

Tôi thực sự khuyên bạn nên sử dụng Gensim ( radimrehurek.com/gensim ) cho nhiệm vụ này. Đặc biệt là các mô hình LSI và / hoặc word2vec và fasttext
Robin

Câu trả lời:


2

Cách dễ nhất để thêm một số loại biện pháp tương tự cấu trúc là sử dụng n-gram; trong trường hợp của bạn bigrams có thể là đủ.

Đi qua từng câu và thu thập các cặp từ, chẳng hạn như:

  • "Trăn là", "là", "tốt", "ngôn ngữ tốt".

Câu khác của bạn có

  • "Ngôn ngữ a", "tốt", "trăn tốt", "trăn là".

Trong số tám bigram bạn có hai cái giống nhau ("trăn là" và "tốt"), vì vậy bạn có thể nói rằng sự tương đồng về cấu trúc là 2/8.

Tất nhiên bạn cũng có thể linh hoạt hơn nếu bạn đã biết rằng hai từ có liên quan đến nhau về mặt ngữ nghĩa. Nếu bạn muốn nói rằng Python là một ngôn ngữ tốt có cấu trúc tương tự / giống hệt với Java là một ngôn ngữ tuyệt vời , thì bạn có thể thêm nó vào so sánh để bạn xử lý hiệu quả "[PROG_LANG] là ngôn ngữ [POSITIVE-ADJ]", hoặc một cái gì đó tương tự.


5

Trước tiên, trước khi chúng tôi bắt đầu, tôi khuyên bạn nên tham khảo các câu hỏi tương tự trên mạng như /datascience/25053/best-pratics-alerskym-for-sentence-similarityhttps: // stackoverflow. com / câu hỏi / 62328 / is-there-an-Thuật-that-Tell-the-semantic-same-of-hai-cụm từ

Để xác định sự giống nhau của câu chúng ta cần xem xét loại dữ liệu nào chúng ta có. Ví dụ: nếu bạn có một tập dữ liệu được dán nhãn tức là các câu tương tự và các câu không giống nhau thì cách tiếp cận thẳng có thể là sử dụng thuật toán được giám sát để phân loại các câu.

Một cách tiếp cận có thể xác định độ tương tự về cấu trúc câu sẽ là trung bình các vectơ từ được tạo bởi thuật toán nhúng từ, tức là word2vec. Các thuật toán này tạo ra một vectơ cho mỗi từ và độ tương tự cosine giữa chúng thể hiện sự tương đồng về ngữ nghĩa giữa các từ. (Daniel L 2017)

Sử dụng vectơ từ chúng ta có thể sử dụng các số liệu sau để xác định độ giống nhau của từ.

  • Khoảng cách cosin giữa các từ nhúng của các từ
  • Khoảng cách Euclide giữa các từ nhúng của các từ

Độ tương tự cosine là thước đo độ tương tự giữa hai vectơ khác không của không gian sản phẩm bên trong đo cosin của góc giữa chúng. Góc cosin là thước đo sự chồng chéo giữa các câu về nội dung của chúng.

Khoảng cách Euclide giữa hai vectơ từ cung cấp một phương pháp hiệu quả để đo lường sự tương đồng về ngôn ngữ hoặc ngữ nghĩa của các từ tương ứng. (Frank D 2015)

Ngoài ra, bạn có thể tính toán riêng của câu để xác định độ tương tự của câu.

Eigenvector là một tập các vectơ đặc biệt liên kết với một hệ phương trình tuyến tính (tức là phương trình ma trận). Ở đây, một ma trận tương tự câu được tạo ra cho mỗi cụm và hàm riêng cho ma trận được tính toán. Bạn có thể đọc thêm về cách tiếp cận dựa trên Eigenvector để xếp hạng câu trên bài viết này https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf

Đối với mã nguồn, Siraj Rawal có một sổ ghi chép Python để tạo một tập các vectơ từ. Các vectơ từ sau đó có thể được sử dụng để tìm sự tương đồng giữa các từ. Mã nguồn có sẵn ở đây https://github.com/llSourcell/word_vector_game_of_thrones-LIVE

Một tùy chọn khác là một hướng dẫn từ Oreily sử dụng thư viện Python của gensin để xác định sự giống nhau giữa các tài liệu. Hướng dẫn này sử dụng NLTK để token hóa sau đó tạo mô hình tf-idf (thuật ngữ tần số tài liệu nghịch đảo thuật ngữ) từ kho văn bản. Sau đó, tf-idf được sử dụng để xác định độ tương tự của các tài liệu. Hướng dẫn có sẵn tại đây https://www.oreilly.com/learning/how-do-i-compare-document-similarity-USE-python


Cảm ơn đã cung cấp các chi tiết có giá trị cho vấn đề. Tôi đã thấy ví dụ về gensim nhưng tôi có một câu hỏi liệu nó có thể giải quyết vấn đề mà tôi đã đề cập trong câu hỏi không. Mặc dù giải pháp tôi tạo ra đang hoạt động tốt trong việc tìm ra sự giống nhau giữa các câu nhưng nó đang bị kẹt khi thứ tự các từ bị xáo trộn.
Shubham Tiwari

4

Cách tiếp cận tốt nhất tại thời điểm này (2019):

Cách tiếp cận hiệu quả nhất hiện nay là sử dụng Bộ mã hóa câu phổ của Google ( paper_2018 ) để tính toán sự giống nhau về ngữ nghĩa giữa các câu bằng cách sử dụng sản phẩm chấm của các nhúng của chúng (tức là các vectơ đã học là 215 giá trị) . Độ tương tự là số nổi giữa 0 (nghĩa là không có độ tương tự) và 1 (nghĩa là độ tương tự mạnh).

Việc triển khai hiện được tích hợp vào Trung tâm Tensorflow và có thể dễ dàng sử dụng. Dưới đây là một mã sẵn sàng để tính toán sự giống nhau giữa 2 câu. Ở đây tôi sẽ nhận được sự tương đồng giữa "Python là một ngôn ngữ tốt""Ngôn ngữ một con trăn tốt là" như trong ví dụ của bạn.

Mã ví dụ:

#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)

Đầu ra:

Similarity is 0.90007496 #Strong similarity

Một tùy chọn khác trong năm 2019 là nhúng câu BERT - bạn có thể xem mã ví dụ tại đây - github.com/hanxiao/bert-as-service
Adnan S
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.