ฉันจะคำนวณความคล้ายคลึงกันของโครงสร้างระหว่างประโยคได้อย่างไร


12

ฉันกำลังทำงานกับปัญหาที่ฉันต้องพิจารณาว่ามีสองประโยคที่เหมือนกันหรือไม่ ฉันนำโซลูชันมาใช้โดยใช้อัลกอริธึม BM25 และการซิงโครไนซ์เครือข่ายเพื่อกำหนดความคล้ายคลึงกันระหว่างไวยากรณ์และความหมาย วิธีแก้ปัญหาทำงานได้อย่างเพียงพอและแม้ว่าลำดับของคำในประโยคจะวนกลับมา แต่ก็เป็นการวัดว่ามีสองประโยคที่คล้ายคลึงกัน ตัวอย่างเช่น

  1. Python เป็นภาษาที่ดี
  2. ภาษาที่ดีคือภาษาไพ ธ อน

ปัญหาของฉันคือพิจารณาว่าประโยคทั้งสองนี้คล้ายกัน

  • สิ่งที่อาจเป็นทางออกที่เป็นไปได้สำหรับความคล้ายคลึงกันของโครงสร้าง?
  • ฉันจะรักษาโครงสร้างของประโยคได้อย่างไร

คุณอาจจะสามารถใช้เวกเตอร์ประโยคและเปรียบเทียบได้
Aiden Grossman

ฉันขอแนะนำให้คุณใช้ Gensim ( radimrehurek.com/gensim ) สำหรับงานนี้ โดยเฉพาะรุ่น LSI และ / หรือ word2vec และ fasttext
Robin

คำตอบ:


2

วิธีที่ง่ายที่สุดในการเพิ่มการวัดความคล้ายคลึงกันของโครงสร้างคือใช้ n-grams ในกรณีของคุณ bigrams อาจจะเพียงพอ

ผ่านแต่ละประโยคและรวบรวมคำศัพท์เช่น:

  • "python is", "is", "a good", "good language"

ประโยคอื่นของคุณมี

  • "language a", "a good", "good python", "python คือ"

จากแปด bigrams คุณมีสองอันที่เหมือนกัน ("python คือ" และ "a good") ดังนั้นคุณสามารถบอกได้ว่าความคล้ายคลึงกันของโครงสร้างคือ 2/8

แน่นอนว่าคุณสามารถยืดหยุ่นได้มากขึ้นถ้าคุณรู้อยู่แล้วว่าคำสองคำนั้นมีความเกี่ยวข้องทางความหมาย ถ้าคุณต้องการบอกว่าPython เป็นภาษาที่ดีมีโครงสร้างคล้าย / เหมือนกับJava เป็นภาษาที่ยอดเยี่ยมจากนั้นคุณสามารถเพิ่มลงในการเปรียบเทียบเพื่อให้คุณประมวลผล "[PROG_LANG] เป็นภาษา [POSITIVE-ADJ] ได้อย่างมีประสิทธิภาพ" หรือสิ่งที่คล้ายกัน


5

ก่อนอื่นเราขอแนะนำให้คุณอ้างอิงคำถามที่คล้ายกันในเครือข่ายเช่น/datascience/25053/best-practical-algorithm-for-sentence-similarityและhttps: // stackoverflow co.th / คำถาม / 62328 / is-มี-ใช้อัลกอริทึมที่-บอก-the-ความหมายคล้ายคลึงกันของสองวลี

เพื่อกำหนดความคล้ายคลึงกันของประโยคเราต้องพิจารณาว่าเรามีข้อมูลประเภทใด ตัวอย่างเช่นถ้าคุณมีชุดข้อมูลที่มีป้ายกำกับนั่นคือประโยคที่คล้ายกันและประโยคที่ไม่เหมือนกันดังนั้นวิธีการส่งต่อโดยตรงอาจใช้วิธีอัลกอริทึมที่มีการตรวจสอบเพื่อจำแนกประโยค

วิธีการที่สามารถกำหนดความคล้ายคลึงกันของโครงสร้างประโยคคือการหาค่าเฉลี่ยของเวกเตอร์คำที่สร้างโดยอัลกอริธึมการฝังคำเช่น word2vec อัลกอริทึมเหล่านี้สร้างเวกเตอร์สำหรับแต่ละคำและความคล้ายคลึงกันในหมู่พวกเขาแสดงถึงความคล้ายคลึงกันทางความหมายในหมู่คำ (Daniel L 2017)

การใช้คำว่าเวคเตอร์เราสามารถใช้เมทริกต่อไปนี้เพื่อกำหนดความคล้ายคลึงกันของคำ

  • ระยะทางโคไซน์ระหว่างคำว่า embeddings ของคำ
  • ระยะทางแบบยุคลิดระหว่างคำว่า embeddings ของคำ

ความคล้ายคลึงโคไซน์เป็นการวัดความคล้ายคลึงกันระหว่างเวกเตอร์ที่ไม่เป็นศูนย์สองตัวของพื้นที่ผลิตภัณฑ์ภายในที่วัดค่าโคไซน์ของมุมระหว่างพวกมัน มุมโคไซน์คือการวัดการทับซ้อนระหว่างประโยคในแง่ของเนื้อหา

ระยะทางแบบยุคลิดระหว่างเวกเตอร์คำสองคำนั้นเป็นวิธีที่มีประสิทธิภาพสำหรับการวัดความคล้ายคลึงกันทางภาษาศาสตร์หรือความหมายของคำที่เกี่ยวข้อง (Frank D 2015)

อีกทางหนึ่งคุณสามารถคำนวณ eigenvector ของประโยคเพื่อกำหนดความคล้ายคลึงกันของประโยค

Eigenvectors เป็นชุดพิเศษของเวกเตอร์ที่เกี่ยวข้องกับระบบเชิงเส้นของสมการ (เช่นสมการเมทริกซ์) ที่นี่เมทริกซ์ความเหมือนประโยคถูกสร้างขึ้นสำหรับแต่ละคลัสเตอร์และ eigenvector สำหรับเมทริกซ์ถูกคำนวณ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิธีการจัดลำดับประโยคของ Eigenvector ในบทความนี้https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf

สำหรับซอร์สโค้ด Siraj Rawal มีโน้ตบุ๊ก Python เพื่อสร้างชุดของ vector vectors คำว่าเวกเตอร์สามารถใช้เพื่อค้นหาความคล้ายคลึงกันระหว่างคำ ซอร์สโค้ดมีให้ที่นี่https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE

อีกตัวเลือกหนึ่งคือบทช่วยสอนจาก Oreily ที่ใช้ไลบรารี Gensin Python เพื่อกำหนดความคล้ายคลึงกันระหว่างเอกสาร บทช่วยสอนนี้ใช้ NLTK เพื่อทำโทเค็นจากนั้นสร้างโมเดล tf-idf (ความถี่เอกสารคำผกผันความถี่ผกผัน) โมเดลจากคลังข้อมูล จากนั้น tf-idf จะถูกใช้เพื่อกำหนดความคล้ายคลึงกันของเอกสาร บทเรียนมีให้ที่นี่https://www.oreilly.com/learning/how-do-i-compare-document-similarity-using-python


ขอขอบคุณที่แจ้งรายละเอียดที่มีค่าสำหรับปัญหา ฉันเคยเห็นตัวอย่างของ gensim แต่ฉันมีคำถามว่ามันจะสามารถแก้ปัญหาที่ฉันกล่าวถึงในคำถาม แม้ว่าวิธีที่ฉันสร้างขึ้นนั้นทำงานได้ดีในการค้นหาความคล้ายคลึงกันระหว่างประโยค แต่มันก็ติดขัดเมื่อคำศัพท์นั้นยุ่งเหยิง
Shubham Tiwari

4

แนวทางที่ดีที่สุดในเวลานี้ (2019):

วิธีที่มีประสิทธิภาพมากที่สุดในขณะนี้คือการใช้ยูนิเวอร์แซประโยค Encoder โดย Google ( paper_2018 ) ซึ่งคำนวณความหมายคล้ายคลึงกันระหว่างประโยคใช้งานผลิตภัณฑ์ของจุดของ embeddings ของพวกเขา(เช่นเรียนรู้เวกเตอร์ของ 215 ค่า) ความคล้ายคลึงกันคือจำนวนลอยตัวระหว่าง 0 (เช่นไม่มีความคล้ายคลึงกัน)และ 1 (เช่นความแข็งแกร่งที่แข็งแกร่ง)

ขณะนี้มีการใช้งานร่วมกับ Tensorflow Hub และสามารถใช้งานได้ง่าย นี่คือรหัสที่พร้อมใช้งานเพื่อคำนวณความคล้ายคลึงกันระหว่าง 2 ประโยค ที่นี่ฉันจะได้รับความคล้ายคลึงกันระหว่าง"งูใหญ่เป็นภาษาที่ดี"และ"ภาษางูหลามที่ดีคือ"ในตัวอย่างของคุณ

ตัวอย่างรหัส:

#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

ตัวเลือกอื่นในปี 2562 คือการฝังประโยค BERT - คุณสามารถดูโค้ดตัวอย่างได้ที่นี่ - github.com/hanxiao/bert-as-service
Adnan S
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.