2013-09-25 12 views
5

के साथ लेटेंट सेमेन्टिक विश्लेषण का उपयोग करें मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जहां मैं कुछ दस्तावेजों की समानता की गणना करूंगा। मैं एलएसए का उपयोग कर ऐसा करना चाहता हूं। मुझे निम्नलिखित कोड मिला है और इसे थोड़ा सा बदल गया है। मेरे पास इनपुट 3 दस्तावेज़ हैं और फिर उनके बीच समानता के साथ 3x3 मैट्रिक्स आउटपुट के रूप में है। मैं वही समानता गणना करना चाहता हूं लेकिन केवल स्केलेर्न लाइब्रेरी के साथ। क्या यह संभव है?sklearn

मैं निम्नलिखित कोड चलाने के लिए, लेकिन मेरे मुंह अभी भी खुला :) है जब TFIDF एक ही विषय के साथ दो दस्तावेजों पर अधिकतम 80% समानता है, यह कोड दें:

from numpy import zeros 
from scipy.linalg import svd 
from math import log 
from numpy import asarray, sum 
from nltk.corpus import stopwords 
from sklearn.metrics.pairwise import cosine_similarity 

titles = [doc1,doc2,doc3] 
ignorechars = ''',:'!''' 

class LSA(object): 
    def __init__(self, stopwords, ignorechars): 
     self.stopwords = stopwords.words('english') 
     self.ignorechars = ignorechars 
     self.wdict = {} 
     self.dcount = 0   
    def parse(self, doc): 
     words = doc.split(); 
     for w in words: 
      w = w.lower() 
      if w in self.stopwords: 
       continue 
      elif w in self.wdict: 
       self.wdict[w].append(self.dcount) 
      else: 
       self.wdict[w] = [self.dcount] 
     self.dcount += 1 
    def build(self): 
     self.keys = [k for k in self.wdict.keys() if len(self.wdict[k]) > 1] 
     self.keys.sort() 
     self.A = zeros([len(self.keys), self.dcount]) 
     for i, k in enumerate(self.keys): 
      for d in self.wdict[k]: 
       self.A[i,d] += 1 
    def calc(self): 
     self.U, self.S, self.Vt = svd(self.A) 
     return -1*self.Vt 

    def TFIDF(self): 
     WordsPerDoc = sum(self.A, axis=0)   
     DocsPerWord = sum(asarray(self.A > 0, 'i'), axis=1) 
     rows, cols = self.A.shape 
     for i in range(rows): 
      for j in range(cols): 
       self.A[i,j] = (self.A[i,j]/WordsPerDoc[j]) * log(float(cols)/DocsPerWord[i]) 

mylsa = LSA(stopwords, ignorechars) 
for t in titles: 
    mylsa.parse(t) 
mylsa.build() 
a = mylsa.calc() 
cosine_similarity(a) 

@ ogrisel के जवाब से मुझे 99.99% पी

dataset = [doc1,doc2,doc3] 
vectorizer = TfidfVectorizer(max_df=0.5,stop_words='english') 
X = vectorizer.fit_transform(dataset) 
lsa = TruncatedSVD() 
X = lsa.fit_transform(X) 
X = Normalizer(copy=False).fit_transform(X) 

cosine_similarity(X) 
+0

उपरोक्त में, एक्स का मूल्य क्या है जिसे आप समानता माप के रूप में विचार कर रहे हैं? –

उत्तर

8

आप sklearn से 0.14+ TruncatedSVD ट्रांसफार्मर का उपयोग कर सकते: आप दस्तावेजों के अपने डेटाबेस पर fit_transform से कॉल करने और फिर transform विधि (समान TruncatedSVD से कॉल यही कारण है कि मुझे लगता है कि यह कुछ गलत है विधि) क्वेरी दस्तावेज़ पर और फिर फ़ंक्शन के साथ परिवर्तित डेटाबेस के साथ रूपांतरित क्वेरी दस्तावेज़ों की कोसाइन समानता की गणना कर सकते हैं: sklearn.metrics.pairwise.cosine_similarity और numpy.argsort परिणामस्वरूप इसी तरह के दस्तावेज़ की अनुक्रमणिका मिलती है।

ध्यान दें कि हुड के तहत, विज्ञान-शिक्षा भी NumPy का उपयोग करती है लेकिन आपके द्वारा दिए गए स्निपेट की तुलना में अधिक कुशल तरीके से (Randomized SVD का उपयोग करके हॉको, मार्टिन्सन और ट्रोप द्वारा चाल)।

+0

क्या आप अपडेट किए गए प्रश्न पर एक नज़र डालें? – Tasos

+0

'TruncatedSVD' में डिफ़ॉल्ट रूप से 'n_components = 2' है। उदाहरण के लिए आपको शायद n_components = 100' की आवश्यकता है। – ogrisel

+1

मैंने कुछ परीक्षण किए हैं और 2 से ऊपर सबकुछ बनाया है, वही परिणाम 0.45 पर दिया गया है। टीएफआईडीएफ के 0.77 के बजाय। मैं इसे सुधारने का एक तरीका खोजने का प्रयास करूंगा, लेकिन आपका उत्तर इस प्रश्न के लिए सही है। धन्यवाद – Tasos

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