स्ट्रिंग्स (शब्दों) की एक लंबी सूची को समानता समूहों में विभाजित करना


31

मुझे हाथ में निम्नलिखित समस्या है: मेरे पास शब्दों की एक बहुत लंबी सूची है, संभवतः नाम, उपनाम आदि, मुझे इस शब्द सूची को क्लस्टर करने की आवश्यकता है, जैसे कि समान शब्द, उदाहरण के लिए समान संपादन वाले शब्द (लेवेंसहाइट) दूरी दिखाई देती है। एक ही क्लस्टर। उदाहरण के लिए "एल्गोरिथ्म" और "एलोग्रिथ" में एक ही क्लस्टर में दिखाई देने की उच्च संभावनाएं होनी चाहिए।

मैं शास्त्रीय अप्रभावी क्लस्टरिंग विधियों जैसे k- साधन क्लस्टरिंग, पैटर्न मान्यता साहित्य में EM क्लस्टरिंग से अच्छी तरह से वाकिफ हूं। यहां समस्या यह है कि ये विधियां उन बिंदुओं पर काम करती हैं जो एक वेक्टर अंतरिक्ष में रहते हैं। मेरे हाथ में तार हैं। ऐसा लगता है कि, एक संख्यात्मक वेक्टर अंतरिक्ष में तारों का प्रतिनिधित्व कैसे करें और स्ट्रिंग क्लस्टरों के "साधनों" की गणना करने का सवाल अब तक मेरे सर्वेक्षण प्रयासों के अनुसार पर्याप्त रूप से उत्तर नहीं दिया गया है। इस समस्या पर हमला करने के लिए एक भोली दृष्टिकोण लेवेंसटेइन दूरी के साथ k-Means क्लस्टरिंग को संयोजित करने के लिए होगा, लेकिन यह सवाल अभी भी "कैसे का प्रतिनिधित्व करता है" का अर्थ है "स्ट्रिंग्स का मतलब है?"। एक वजन है जिसे टीएफ-आईडीएफ वजन कहा जाता है, लेकिन ऐसा लगता है कि यह ज्यादातर "टेक्स्ट डॉक्यूमेंट" क्लस्टरिंग के क्षेत्र से संबंधित है, न कि एकल शब्दों के क्लस्टरिंग के लिए। http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf

इस क्षेत्र में मेरी खोज अभी भी जारी है, लेकिन मैं यहां से भी विचार लाना चाहता था। इस मामले में आप क्या सलाह देंगे, क्या कोई इस तरह की समस्या के लिए किसी भी तरीके से परिचित है?


1
मैंने "K-medoids" के रूप में नामित k- साधनों के एक प्रकार के अस्तित्व के बारे में सीखा है। en.wikipedia.org/wiki/K-medoids यह एल 2 यूक्लिडियन दूरी पर काम नहीं करता है और इसे साधनों की गणना की आवश्यकता नहीं है। यह डेटा बिंदु का उपयोग करता है जो क्लस्टर में "मेडोइड" के रूप में अन्य लोगों के सबसे करीब है।
उफुक कैन बिस्किट

1
It seems that there are some special string clustering algorithms। यदि आप विशेष रूप से टेक्स्ट-माइनिंग फ़ील्ड से आते हैं, तो आँकड़े / डेटा विश्लेषण नहीं, तो यह कथन वारण्टेड है। हालाँकि, अगर आपको क्लचिंग शाखा सीखने को मिलती है, क्योंकि आप पाएंगे कि स्ट्रिंग डेटा के लिए कोई "विशेष" एल्गोरिदम मौजूद नहीं है। "विशेष" यह है कि आप इस तरह के डेटा को क्लस्टर विश्लेषण में इनपुट करने से पहले कैसे संसाधित करते हैं।
ttnphns

संबं धत
लं क

Affinity Propagation और K-Means क्लस्टरिंग के बीच अंतर पर ध्यान दें और यह गणना समय को कैसे प्रभावित करेगा। quora.com/…
गैब्रियल एलोन

जवाबों:


37

आत्मीयता प्रचार के लिए माइकन की सिफारिश का पालन करना ।

कागज से: एल फ्रे, ब्रेंडन जे, और डेल्बर्ट लॉक। "डेटा बिंदुओं के बीच संदेश पास करके क्लस्टरिंग।" विज्ञान 315.5814 (2007): 972-976।

कई पैकेजों के माध्यम से इसका सुपर आसान उपयोग। यह कुछ पर काम करता है जिसे आप युग्मक समानता एक परिभाषित कर सकते हैं। जिसे आप लेवेंसाइटिन दूरी को 1 से गुणा करके प्राप्त कर सकते हैं।

मैंने इनपुट के रूप में आपके प्रश्न के पहले पैराग्राफ का उपयोग करते हुए एक त्वरित उदाहरण को एक साथ फेंक दिया। पायथन 3 में:

import numpy as np
import sklearn.cluster
import distance

words = "YOUR WORDS HERE".split(" ") #Replace this line
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])

affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed", damping=0.5)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    exemplar = words[affprop.cluster_centers_indices_[cluster_id]]
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:* %s" % (exemplar, cluster_str))

आउटपुट था (क्लस्टर के बाईं ओर वे इटैलिक्स में उदाहरण हैं)

  • है: संभावना है, संपादित करें, हाथ, है, उच्च
  • निम्नलिखित: निम्नलिखित
  • समस्या: समस्या
  • I: I, a, at, etc, इन, लिस्ट, ऑफ,
  • संभवतः: संभवतः
  • क्लस्टर: क्लस्टर
  • शब्द: के लिए, और, के लिए, लंबी, जरूरत, चाहिए, बहुत, शब्द, शब्द
  • समान: समान
  • लेवेनशेटिन: लेवेंसहेटिन
  • दूरी: दूरी
  • :: कि, ए, यह, के साथ,
  • समान: उदाहरण, सूची, नाम, समान, ऐसे, उपनाम
  • एल्गोरिथ्म: एल्गोरिथ्म, एलोग्रिथ
  • प्रकट: प्रकट होता है

इसे 50 यादृच्छिक पहले नामों की सूची में चलाना :

  • डायने: डायना , डायने, डायने, जेराल्ड, इरिना, लिसेट, मिन्ना, निकी, रिकी
  • जानी: क्लेयर, जानी, जेसन, जेसी, किमी, लैंग, मार्कस, मैक्सिमा, रैंडी, राउल
  • वेरलाइन: डेस्टिनी, केली, मैरीलिन, मर्सिडीज, स्टर्लिंग, वेरलाइन
  • ग्लेन: एलेनोर, ग्लेन, ग्वेंडा
  • आर्मंडिना: आर्मंडिना, ऑगस्टिना
  • शीला: अहमद, एस्टेला, मिलिसा, शीला, थ्रेसा, व्यनेल
  • लॉरेन: ऑटम, हायडी, लॉरेन, लॉरेन
  • अल्बर्टो: अल्बर्टा, अल्बर्टो, रॉबर्ट
  • विद्या: अम्मी, डोरेन, एरा, जोसेफ, विद्या, लोरी, पोर्टर

मुझे बहुत अच्छा लगता है (वह मजेदार था)।


क्या केवल स्केलेर का उपयोग करके एक ही एल्गोरिदम होना संभव है? या हैमिंग के साथ scipy.spatial.distance का उपयोग करें? लेवेंसाइटिन का उपयोग करने के लिए क्या लाभ है? मुझे लगता है कि मुझे इस प्रश्न का उपयोग करने की कोशिश करनी होगी: stackoverflow.com/questions/4588541/…
pierre

1
@ पियरे लेवेन्सटाइन वह है जिसे मैं "स्पेलसेचर की दूरी" कहूंगा, यह एक मानव वर्तनी की गलती के लिए एक अच्छा प्रॉक्सी है। डमरू लेवन्सहाइट और भी बेहतर हो सकता है। मुझे नहीं पता है कि हैमिंग डिस्टेंस को किसी भी लंबाई के तार के लिए परिभाषित किया गया है। यह केवल स्वैप की अनुमति देता है, न कि प्रविष्टि की। यह निर्धारित करना कि स्ट्रिंग को अधिकतम रूप से पैड / ट्रिम कैसे करना है, लेवेंसहाइट डिस्टेंस की गणना करना लगभग उतना ही कठिन है। क्या आपको प्रारंभ को ट्रिम / पैड करना चाहिए? समाप्त? बीच में से कुछ?
लिंडन व्हाइट

यदि आप वास्तव में दूरियों पर निर्भरता से बचना चाहते थे। आप Rossetta कोड कार्यान्वयन का
Lyndon व्हाइट

en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance को पढ़कर मैं देख सकता हूं कि ट्रांसपोज़िशन टाइपो के लिए विशेष रूप से अंतर कैसे कर सकता है और अजगर के पास इसके लिए एक ब्रांड पैकेज है। मैं यह देख सकता हूं कि मैं इसे शब्दों की सूची के खिलाफ कैसे उपयोग कर सकता हूं और "निकटतम व्यक्ति" प्राप्त कर सकता हूं लेकिन सबसे महत्वपूर्ण नहीं हो सकता। मुझे अपनी सूची प्राप्त करनी है और tf-idf से जांच करनी है। कूल
पियरे

1
@dduhaime लगभग निश्चित रूप से। सामान्य आत्मीयता प्रचार में निरर्थक संदर्भों के लिए काम करता है, लेकिन चूंकि यह सममित है। मुझे यकीन है कि SciPy में कुछ त्रिकोणीय मैट्रिक्स प्रकार है जो पूर्ण मैट्रिक्स के रूप में ducktypes है। मैं जूलिया-लैंग लैंड में बहुत लंबे समय से हूं और यह याद नहीं कर सकता कि यह अजगर में कैसे किया जाता है। (जूलिया ऑरल्ड उपयोग में Symmetric)
लिंडन व्हाइट

5

ग्राफ क्लस्टरिंग एल्गोरिदम का उपयोग करें, जैसे कि लौवेन क्लस्टरिंग, रिस्ट्रिक्टेड नेबरहुड सर्च क्लस्टरिंग (आरएनएससी), एफिनिटी प्रोस्पेशन क्लस्टरिंग (एपीसी), या मार्कोव क्लस्टर एल्गोरिथ्म (एमसीएल)।


के-मेडोइड्स विधि के बारे में मैंने क्या पाया है? मुझे इस समाधान को जल्द से जल्द लागू करने की आवश्यकता है, इसलिए यह मेरे लिए एक अच्छा समाधान था। मैं इन ग्राफ आधारित विधियों के अस्तित्व से अवगत हूं, लेकिन मुझे डर है कि मैं उन समय को बर्दाश्त नहीं कर सकता, जिन्हें मुझे समझने और लागू करने की आवश्यकता है।
उफुक कैन बिचिस

उन सभी के लिए सॉफ्टवेयर काफी गैर-प्रतिबंधक लाइसेंसिंग समझौतों के साथ उपलब्ध है, जैसे कि GNU GPL। मैं के-मेडियोड्स प्रकार के एल्गोरिथ्म का एक बड़ा प्रशंसक नहीं हूं क्योंकि ज्यादातर के पैरामीटर के कारण होता है लेकिन यह स्वाभाविक रूप से आपके ऊपर है। यदि आपको इन-हाउस कार्यान्वयन की आवश्यकता है तो मुझे लगता है कि एपीसी और एमसीएल को लागू करना सबसे आसान है। यदि आप ऐसा करने वाले थे, तो उन्हें सबसे पहले आज़माएँ।
माइक

2

आप वेक्टर स्पेस प्रविष्टियों को वेक्टर स्पेस प्रविष्टियों के रूप में शब्दों के एन-ग्राम के साथ आज़मा सकते हैं। मुझे लगता है कि आपको संपादित दूरी के बजाय इस मामले में कोसाइन समानता जैसी माप का उपयोग करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.