स्वचालित कीवर्ड निष्कर्षण: सुविधाओं के रूप में कोसाइन समानताओं का उपयोग करना


12

मुझे एक दस्तावेज़-टर्म मैट्रिक्स , और अब मैं एक पर्यवेक्षित शिक्षण पद्धति (SVM, Naive Bayes, ...) के साथ प्रत्येक दस्तावेज़ के लिए कीवर्ड निकालना चाहूंगा। इस मॉडल में, मैं पहले से ही Tf-idf, Pos टैग, ...

लेकिन अब मैं nexts के बारे में सोच रहा हूं। मुझे शर्तों के बीच कॉस्मिक समानता के साथ एक मैट्रिक्स मिला है ।सी

क्या मेरे मॉडल के लिए एक विशेषता के रूप में इस समानता का उपयोग करने की संभावना है? मेरा विचार अवधि के लिए था दस्तावेज़ में , दस्तावेज़ में सभी नियमों की कोज्या समानता के औसत का उपयोग करने के लिए पद के साथ मैं । क्या यह उपयोगी है?मैंमैं


क्या आपने Google पर खोज की थी? मुझे "cosine समानता कीवर्ड निष्कर्षण" के तहत बहुत सारे हिट मिले, जो ऐसा लगता है कि वे आपको शुरू कर सकते हैं
शैडोअल्कर

मैंने Google पर बहुत खोज की है और मैंने इसमें "cosine समानता" और "कीवर्ड निष्कर्षण" शब्दों के साथ कई पेपर पढ़े हैं। लेकिन मुझे एक कागज नहीं मिला जहां वे कुछ सारिणी समानता जैसी चीज़ों का उपयोग करते हैं जैसे कि कीवर्ड निकालने के लिए
Silke

जवाबों:


12

मुझे नहीं पता कि पर्यवेक्षित शिक्षण के साथ कीवर्ड निष्कर्षण करना कैसे संभव है, लेकिन मैं यह जानता हूं कि इसे बिना पढ़े हुए शिक्षण के साथ कैसे किया जाता है।

ऐसा करने के कई तरीके हैं, इसलिए वे यहां हैं:

श्रेणीबद्ध

आप सीधे समानता मैट्रिक्स पर किसी भी पदानुक्रमिक क्लस्टरिंग विधि को लागू कर सकते हैं (किसी भी समानता फ़ंक्शन के साथ, केवल कोसाइन नहीं)

स्किटिट-लर्न में आप कुछ इस तरह से करेंगे:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.cluster import AgglomerativeClustering

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(data)
C = 1 - cosine_similarity(X.T)
ward = AgglomerativeClustering(n_clusters=k, linkage='ward').fit(C)
label = ward.labels_

स्रोत: [१]

लेकिन चूंकि यह एग्लोमेरेटिव क्लस्टरिंग है, इसलिए यह कम्प्यूटेशनल रूप से महंगा है और इसे गणना करने में थोड़ा समय लगेगा।

कश्मीर साधन

एक और संभावना है कि टर्म-डॉक्यूमेंट मैट्रिक्स की पंक्तियों पर सामान्य k- साधन करें, और फिर प्रत्येक सेंट्रोइड के लिए सबसे सामान्य शब्द खोजें

उदाहरण के लिए, scikit में जानें कि यह करने का तरीका है:

from sklearn.cluster import KMeans

km = KMeans(n_clusters=k, init='k-means++', max_iter=100, n_init=1)
km.fit(X)
order_centroids = km.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
for i in range(k):
    print("Cluster %d:" % i, end='')
    for ind in order_centroids[i, :10]:
        print(' %s' % terms[ind], end='')

स्रोत: [२]

लेकिन के-साधन यूक्लिडियन दूरी पर निर्भर करता है, जो विरल उच्च-आयामी डेटा के लिए खराब है। ऐसी अन्य तकनीकें हैं जो ग्रंथों के लिए बेहतर काम करती हैं और कॉस्मिक समानता का उपयोग करती हैं

कोसाइन के-मीन्स और स्कैटर / इकट्ठा

के- माध्य (देखें [3] देखें ) के साथ कोसाइन का उपयोग करना संभव है : प्रत्येक क्लस्टर में सभी दस्तावेजों पर माध्य के रूप में सेंट्रोइड्स की गणना करें, और फिर निकटतम सेंटीमीटर की दूरी की गणना करने के लिए कोसाइन का उपयोग करें।

अंत में, आप कीवर्ड को उसी तरह से निकाल सकते हैं जैसे कि सामान्य k- साधनों के लिए।

क्लस्टर में सभी दस्तावेजों के औसत के रूप में औसत सेंट्रोइड की गणना करना हमेशा अच्छा नहीं होता है। स्कैटर / गैदर एल्गोरिथ्म [4] में एक और दृष्टिकोण का सुझाव दिया गया है : एक क्लस्टर का केन्द्रक इस क्लस्टर में सभी दस्तावेजों का समाकलन है।

इस दृष्टिकोण के लिए आपको बस प्रत्येक सेंट्रोइड क्लस्टर के लिए सबसे अधिक बार शब्द लेने होंगे।

स्किकिट में इन एल्गोरिदम का कोई भी कार्यान्वयन नहीं है, लेकिन आप आसानी से इन्हें लागू करके खुद को लागू कर सकते हैं KMeans

ध्यान दें कि दोनों मामलों में सेंट्रोइड काफी घने हो जाते हैं: प्रत्येक क्लस्टर्स में बाकी दस्तावेजों की तुलना में सघन, इसलिए आप सेंट्रोइड में शर्तों को छोटा करना चाहते हैं , अर्थात "महत्वहीन" को हटा सकते हैं। (देखें [8])।

वर्णक्रमीय क्लस्टरिंग

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

इसे SpectralClusteringकक्षा में लागू किया गया है , उदाहरण देखें [5] में । ध्यान दें कि चूंकि आपके पास पहले से ही एक पूर्व-संकलित मैट्रिक्स है, इसलिए आपको affinity='precumputed'आरंभ करते समय विशेषता का उपयोग करने की आवश्यकता होती है।

वर्णक्रमीय क्लस्टरिंग कर्नेल केमन्स से संबंधित है: इसमें कागज (देखें [7]) है जो दर्शाता है कि वे एक ही चीज हैं। मैं हाल ही में कर्नेल केमन्स के कार्यान्वयन में आया था जो उपयोगी हो सकते हैं: https://gist.github.com/mblondel/b30308787

गैर-नकारात्मक मैट्रिक्स फैक्टराइजेशन

अंत में, आप एसवीडी (यह तथाकथित "लेज़ेंट सिमेंटिक एनालिसिस") या नॉन-निगेटिव मैट्रिक्स फैक्टराइजेशन जैसे रैखिक बीजगणित से कुछ अपघटन तकनीकों के साथ टर्म-डॉक्यूमेंट मैट्रिक्स को क्लस्टर कर सकते हैं। उत्तरार्द्ध को क्लस्टरिंग के रूप में देखा जा सकता है, और यह एक ही समय में मैट्रिक्स की दोनों पंक्तियों और स्तंभों को क्लस्टर कर सकता है।

उदाहरण के लिए, आप कीवर्ड कर सकते हैं

from sklearn.decomposition import NMF
nmf = NMF(n_components=k, random_state=1).fit(X)

feature_names = vectorizer.get_feature_names()

for topic_idx, topic in enumerate(nmf.components_):
    print("Topic #%d:" % topic_idx)
    print(" ".join([feature_names[i]
                    for i in topic.argsort()[:-10-1:-1]]))
    print()

कोड स्रोत: [६]

यहाँ तक कि उदाहरण अजगर स्किकिट-लर्न में हैं, मुझे लगता है कि आर के लिए कुछ उदाहरण ढूंढना एक बड़ी समस्या नहीं होनी चाहिए

सूत्रों का कहना है


1
यह एक अविश्वसनीय रूप से उच्च गुणवत्ता वाला उत्तर है। धन्यवाद! क्या आपके पास शब्द को क्लस्टर करने के लिए Scikit के आत्मीयता प्रचार एल्गोरिथ्म का उपयोग करने पर कोई विचार है? एल्गोरिथ्म में एक पूर्वसंबंधित आत्मीयता मैट्रिक्स के रूप में कॉस्मिक समानता मूल्यों का उपयोग किया जा सकता है (मेरा मानना ​​है कि समानता की आवश्यकता होगी, दूरी नहीं)।
नील्सिव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.