2010-10-27 18 views
5

मैं वाक्य समानता के बारे में एक परियोजना पर काम कर रहा हूं। मुझे पता है कि एसओ में कई बार पूछा गया है, लेकिन मैं सिर्फ यह जानना चाहता हूं कि जिस तरीके से मैं इसे कर रहा हूं, उस तरीके से मेरी समस्या को पूरा किया जा सकता है, या मुझे समस्या के प्रति अपना दृष्टिकोण बदलना चाहिए। काफी हद तक, प्रणाली को एक लेख के सभी वाक्यों को विभाजित करना और सिस्टम को खिलाए गए अन्य लेखों के बीच समान वाक्य मिलना चाहिए।एन-ग्राम वाक्य कोसाइन समानता माप के साथ समानता

मैं टीएफ-आईडीएफ वजन के साथ कोसाइन समानता का उपयोग कर रहा हूं और इसी तरह मैंने इसे किया है।

1- सबसे पहले, मैंने सभी लेखों को वाक्यों में विभाजित किया, फिर मैं प्रत्येक वाक्य के लिए ट्रिग्राम उत्पन्न करता हूं और उन्हें क्रमबद्ध करता हूं (क्या मुझे चाहिए?)।

2- मैं ट्रिग्राम के टीएफ-आईडीएफ वजन की गणना करता हूं और सभी वाक्यों के लिए वैक्टर बना देता हूं।

3- मैं डॉट उत्पाद और मूल वाक्य की परिमाण और गणना की गणना की गणना करता हूं। फिर कोसाइन समानता की गणना करें।

हालांकि, सिस्टम की अपेक्षा के अनुसार काम नहीं करता है। यहां, मेरे दिमाग में मेरे कुछ प्रश्न हैं।

जहां तक ​​मैंने टीएफ-आईडीएफ वजन के बारे में पढ़ा है, मुझे लगता है कि वे समान "दस्तावेज़" ढूंढने के लिए अधिक उपयोगी हैं। चूंकि मैं वाक्यों पर काम कर रहा हूं, मैंने टीएफ और आईडीएफ परिभाषाओं के सूत्र के कुछ चर बदलकर एल्गोरिदम को थोड़ा संशोधित किया है (दस्तावेज़ के बजाय मैंने वाक्य आधारित परिभाषा के साथ आने की कोशिश की है)।

tf = वाक्य में सब trigrams की सजा/संख्या में trigram की पुनरावृत्ति की संख्या

आईडीएफ = सभी लेख में सभी वाक्य की संख्या/वाक्य की संख्या जहां trigram प्रकट होता है

क्या आपको लगता है यह ठीक है इस समस्या के लिए ऐसी परिभाषा का उपयोग करने के लिए?

एक और बात यह है कि मैंने देखा कि कोसाइन समानता की गणना करते समय सामान्यीकरण का उल्लेख कई बार किया गया है। मैं अनुमान लगा रहा हूं कि यह महत्वपूर्ण है क्योंकि ट्राइग्राम वेक्टर एक ही आकार नहीं हो सकते हैं (जो वे शायद ही कभी मेरे मामले में हैं)। यदि एक ट्रिग्राम वेक्टर एक्स का आकार होता है और दूसरा x + 1 होता है, तो मैं पहले वेक्टर का इलाज करता हूं क्योंकि यह अंतिम मान के साथ x + 1 का आकार था। क्या यह सामान्यीकरण के माध्यम से है? यदि नहीं, तो मैं सामान्यीकरण कैसे करूं?

इनके अलावा, अगर मैंने गलत एल्गोरिदम चुना है तो ऐसी समस्या के लिए और क्या उपयोग किया जा सकता है (अधिमानतः एन-ग्राम दृष्टिकोण के साथ)?

अग्रिम धन्यवाद।

उत्तर

5

मुझे यकीन नहीं है कि आप हर वाक्य के लिए ट्रिग्राम क्यों क्रमबद्ध कर रहे हैं। कोसाइन समानता की गणना करते समय आपको केवल देखभाल करने की आवश्यकता है कि क्या एक ही ट्रिगर दो वाक्यों में हुआ था या नहीं और आवृत्तियों के साथ। संकल्पनात्मक रूप से आप सभी संभावित ट्रिग्रामों के बीच एक निश्चित और सामान्य आदेश परिभाषित करते हैं। याद रखें कि ऑर्डर सभी वाक्यों के लिए समान होना चाहिए। यदि संभावित ट्रिग्राम की संख्या एन है, तो प्रत्येक वाक्य के लिए आप आयाम की वेक्टर प्राप्त करते हैं। यदि कोई निश्चित ट्रिगर नहीं होता है, तो आप वेक्टर में शून्य मान को संबंधित मान सेट करते हैं। आपको ज़ीरो को स्टोर करने की ज़रूरत नहीं है, लेकिन जब आप डॉट उत्पाद को परिभाषित करते हैं तो उन्हें ख्याल रखना होगा।

ऐसा कहकर, ट्रिग्राम एक अच्छा विकल्प नहीं है क्योंकि एक मैच की संभावना बहुत अधिक है। उच्च के लिए आप के-ग्राम के बजाय लगातार शब्दों के बैग से बेहतर परिणाम प्राप्त करेंगे। ध्यान दें कि ऑर्डरिंग बैग के अंदर कोई फर्क नहीं पड़ता, यह एक सेट है। आप के = 3 के-ग्राम का उपयोग कर रहे हैं, लेकिन यह उच्च तरफ, विशेष रूप से वाक्यों के लिए प्रतीत होता है।या तो 1 से शुरू होने वाली विभिन्न लंबाई के द्वि-ग्राम या बैग का उपयोग करें। पसंदीदा रूप से दोनों का उपयोग करें।

मुझे यकीन है कि आपने देखा है कि सटीक ट्रिग्राम का उपयोग नहीं करने वाले वाक्यों में आपकी विधि में 0 समानता है। शब्दों के के-बैग कुछ हद तक स्थिति को कम करेगा लेकिन इसे पूरी तरह से हल नहीं करेगा। क्योंकि अब आपको वास्तविक शब्दों को साझा करने के लिए वाक्यों की आवश्यकता है। एक ही शब्द का उपयोग किए बिना दो वाक्य समान हो सकते हैं। इसे ठीक करने के कुछ तरीके हैं। या तो एलएसआई (लेटेंट सेमेन्टिक इंडेक्सिंग) या शब्दों के क्लस्टरिंग का उपयोग करें और क्लोजर लेबल का उपयोग अपनी कोसाइन समानता को परिभाषित करने के लिए करें।

वैक्टर x और y के बीच कोसाइन समानता की गणना करने के लिए आप डॉट उत्पाद की गणना करते हैं और एक्स और वाई के मानदंडों से विभाजित होते हैं। वेक्टर एक्स के 2-मानक को वर्गों के योग के वर्ग रूट के रूप में गणना की जा सकती है। हालांकि आपको तुलना करने के लिए किसी भी सामान्यीकरण के बिना अपने एल्गोरिदम को भी आज़माएं। आम तौर पर यह ठीक काम करता है, क्योंकि आप शब्द आवृत्तियों (टीएफ) की गणना करते समय वाक्यों के सापेक्ष आकारों का ख्याल रखते हैं।

उम्मीद है कि इससे मदद मिलती है।

+0

@Ahmet यदि कुछ भी है जो आप मुझे स्पष्टीकरण देना चाहते हैं, तो मुझे बताएं। – srean

+0

आपके उत्तर के लिए धन्यवाद। सबसे पहले, वेक्टर को सॉर्ट करने का कारण यह है कि मुझे बेहतर परिणाम मिलते हैं। मैंने कोशिश की कि आप क्या सुझाव देते हैं लेकिन कोई भाग्य नहीं है। लेकिन मुझे बस कुछ एहसास हुआ कि समान शब्द आमतौर पर समान लंबाई वाले होते हैं। यह कोसाइन समानता मुझे थोड़ा यादृच्छिक लगती है क्योंकि हम एन-ग्राम के बीच कनेक्शन की जांच नहीं कर रहे हैं, इसके बजाय हम एन-ग्राम की आवृत्ति की जांच कर रहे हैं कि वे क्या हैं। शायद अभी भी, मुझे कुछ याद आ रहा है। –

+0

बेशक कोसाइन समानता यादृच्छिक दिखाई देगी यदि आप परवाह नहीं करते हैं तो वे मेल खाते हैं या नहीं, क्योंकि उस मामले में आप जो कंप्यूटिंग कर रहे हैं उसके पास कोसाइन समानता से कोई लेना देना नहीं है। आप इसे गलत कर रहे हैं और इस मामले में यह परिभाषा के अनुसार यादृच्छिक हो। इसे एक और प्रयास दें और निर्देशों का बारीकी से पालन करें, यह काम करेगा। – srean

संबंधित मुद्दे