मैं वाक्यों के बीच संरचनात्मक समानता की गणना कैसे करूं?


12

मैं एक ऐसी समस्या पर काम कर रहा हूँ जहाँ मुझे यह निर्धारित करने की आवश्यकता है कि दो वाक्य समान हैं या नहीं। मैंने वाक्यविन्यास और अर्थ समानता का निर्धारण करने के लिए BM25 एल्गोरिथ्म और वर्डनेट सिंटसेट का उपयोग करके एक समाधान लागू किया। समाधान पर्याप्त रूप से काम कर रहा है, और भले ही वाक्यों में शब्द क्रम उछल गया हो, यह माप रहा है कि दो वाक्य समान हैं। उदाहरण के लिए

  1. अजगर एक अच्छी भाषा है।
  2. भाषा एक अच्छा अजगर है।

मेरी समस्या यह निर्धारित करना है कि ये दोनों वाक्य समान हैं।

  • संरचनात्मक समानता के लिए संभावित समाधान क्या हो सकता है?
  • मैं वाक्यों की संरचना को कैसे बनाए रखूंगा?

आप वाक्य वैक्टर का उपयोग करने और उनकी तुलना करने में सक्षम हो सकते हैं।
एडेन ग्रॉसमैन

मैं आपको इस कार्य के लिए Gensim ( radimrehurek.com/gensim ) का उपयोग करने का अत्यधिक सुझाव देता हूं । विशेष रूप से मॉडल LSI और / या word2vec और fasttext
रॉबिन

जवाबों:


2

एन-ग्राम का उपयोग करने के लिए कुछ प्रकार की संरचनात्मक समानता उपाय जोड़ने का सबसे आसान तरीका है; आपके मामले में बड़ी रकम पर्याप्त हो सकती है।

प्रत्येक वाक्य के माध्यम से जाओ और शब्दों के जोड़े इकट्ठा करें, जैसे:

  • "अजगर है", "एक", "एक अच्छा", "अच्छी भाषा" है।

आपके दूसरे वाक्य में है

  • "भाषा ए", "एक अच्छा", "अच्छा अजगर", "अजगर" है।

आठ बीघे में से आपके पास दो हैं जो समान हैं ("अजगर" और "एक अच्छा"), इसलिए आप कह सकते हैं कि संरचनात्मक समानता 2/8 है।

बेशक आप अधिक लचीले भी हो सकते हैं यदि आप पहले से ही जानते हैं कि दो शब्द शब्दार्थ से संबंधित हैं। यदि आप यह कहना चाहते हैं कि पायथन एक अच्छी भाषा है जो संरचनात्मक रूप से समान है / जावा के समान है तो यह एक महान भाषा है , तो आप इसे तुलना में जोड़ सकते हैं ताकि आप प्रभावी रूप से प्रक्रिया कर सकें "[PROG_LANG] एक [स्थिति-एडीजे" भाषा है ", या ऐसा ही कुछ।


5

सबसे पहले, शुरू करने से पहले मैं आपको सलाह देता हूं कि आप नेटवर्क पर इसी तरह के सवालों का संदर्भ लें जैसे कि /datascience/25053/best-practical-al एल्गोरिदम-for - sentence - slilarity और https: // stackoverflow। com / प्रश्न / 62,328 / है-वहाँ-एक-कलन विधि-कि-बताता है-अर्थ-समानता के-दो वाक्यांशों

वाक्यों की समानता का निर्धारण करने के लिए हमें विचार करना होगा कि हमारे पास किस प्रकार का डेटा है। उदाहरण के लिए, यदि आपके पास एक लेबल डेटासेट यानी समान वाक्य और डिस्मिलर वाक्य हैं, तो वाक्यों को वर्गीकृत करने के लिए एक पर्यवेक्षित एल्गोरिथ्म का उपयोग करने के लिए एक सीधा आगे का दृष्टिकोण हो सकता है।

एक दृष्टिकोण जो वाक्य संरचनात्मक समानता को निर्धारित कर सकता है वह शब्द एम्बेडिंग एल्गोरिदम द्वारा उत्पन्न शब्द वैक्टर को औसत करना होगा। ये एल्गोरिदम प्रत्येक शब्द के लिए एक सदिश का निर्माण करते हैं और उनके बीच की ब्रह्मांडीय समानता शब्दों के बीच शब्दार्थ समानता का प्रतिनिधित्व करती है। (डैनियल एल 2017)

शब्द वैक्टर का उपयोग करके हम शब्दों की समानता निर्धारित करने के लिए निम्नलिखित मैट्रिक्स का उपयोग कर सकते हैं।

  • शब्दों के शब्द एम्बेडिंग के बीच कॉशन दूरी
  • शब्दों के शब्द एम्बेडिंग के बीच यूक्लिडियन दूरी

कॉसीन समानता एक आंतरिक उत्पाद अंतरिक्ष के दो गैर-शून्य वैक्टर के बीच समानता का एक उपाय है जो उनके लिए कोण के कोसाइन को मापता है। कोसाइन कोण उनकी सामग्री के संदर्भ में वाक्यों के बीच ओवरलैप का माप है।

दो शब्द वैक्टर के बीच यूक्लिडियन दूरी, संबंधित शब्दों की भाषाई या अर्थ समानता को मापने के लिए एक प्रभावी तरीका प्रदान करता है। (फ्रैंक डी 2015)

वैकल्पिक रूप से आप वाक्य समानता को निर्धारित करने के लिए वाक्यों के आइजनवेक्टर की गणना कर सकते हैं।

Eigenvectors समीकरणों के एक रैखिक प्रणाली (यानी मैट्रिक्स समीकरण) से जुड़े वैक्टर का एक विशेष सेट है। यहां प्रत्येक क्लस्टर के लिए एक वाक्य समानता मैट्रिक्स उत्पन्न होती है और मैट्रिक्स के लिए आइजनवेक्टर की गणना की जाती है। आप इस पेपर पर वाक्य रैंकिंग के लिए Eigenvector आधारित दृष्टिकोण पर अधिक पढ़ सकते हैं https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf

स्रोत कोड के लिए सिराज रावल के पास शब्द वैक्टर का एक सेट बनाने के लिए पायथन नोटबुक है। शब्द वैक्टर का उपयोग तब शब्दों के बीच समानता खोजने के लिए किया जा सकता है। स्रोत कोड यहां उपलब्ध है https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE

एक अन्य विकल्प ऑरेली से एक ट्यूटोरियल है जो दस्तावेजों के बीच समानता को निर्धारित करने के लिए जेनसिन पायथन लाइब्रेरी का उपयोग करता है। यह ट्यूटोरियल NLTK का उपयोग टोकन के लिए करता है, फिर कॉर्पस से एक tf-idf (शब्द आवृत्ति-व्युत्क्रम दस्तावेज़ आवृत्ति) मॉडल बनाता है। Tf-idf का उपयोग तब दस्तावेजों की समानता को निर्धारित करने के लिए किया जाता है। ट्यूटोरियल यहां उपलब्ध है https://www.oreilly.com/learning/how-do-i-compare-document-similarity-use-python


समस्या के लिए बहुमूल्य विवरण प्रदान करने के लिए धन्यवाद। मैंने gensim का उदाहरण देखा था, लेकिन मेरे पास एक सवाल है कि क्या यह उस समस्या को हल करने में सक्षम होगा जिसका मैंने उल्लेख किया था। हालाँकि मैंने जो हल बनाया है वह वाक्यों के बीच समानता खोजने में ठीक काम कर रहा है लेकिन जब शब्दों का क्रम गड़बड़ा जाता है तो यह अटक जाता है।
शुभम तिवारी

4

इस समय सबसे अच्छा तरीका (2019):

अब सबसे प्रभावी दृष्टिकोण Google ( paper_2018 ) द्वारा यूनिवर्सल सेंटेंस एनकोडर का उपयोग करना है, जो उनके एम्बेडिंग के डॉट उत्पाद (अर्थात 215 मानों के सीखे हुए वैक्टर) का उपयोग करके वाक्यों के बीच शब्दार्थ समानता की गणना करता है । समानता 0 (यानी कोई समानता नहीं) और 1 (यानी मजबूत समानता) के बीच एक फ्लोट संख्या है

कार्यान्वयन अब टेंसोफ़्लो हब से एकीकृत है और आसानी से उपयोग किया जा सकता है। 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

2019 में एक और विकल्प BERT वाक्य एम्बेडिंग है - आप यहां उदाहरण कोड देख सकते हैं - github.com/hanxiao/bert-as-service
Adnan S
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.