शब्द आवृत्ति / उलटा दस्तावेज़ आवृत्ति (TF / IDF): भार


12

मुझे एक डेटासेट मिला है जो 1000 दस्तावेजों और उसमें दिखाई देने वाले सभी शब्दों का प्रतिनिधित्व करता है। इसलिए पंक्तियाँ दस्तावेजों का प्रतिनिधित्व करती हैं और कॉलम शब्दों का प्रतिनिधित्व करते हैं। उदाहरण के लिए, सेल में मान बार शब्द के लिए खड़ा है दस्तावेज़ में होता है । अब, मुझे tf / idf मेथड का उपयोग करते हुए, शब्दों का 'वेट' ढूंढना है, लेकिन मुझे वास्तव में यह नहीं पता है कि यह कैसे करना है। क्या कोई व्यक्ति कृपा करके मेरी सहायता करेगा?j i(i,j)ji


कीवर्ड एक्सट्रेक्शन के लिए tf-idf-Statistic - joyofdata.de/blog/tf-idf-statistic-keyword-extraction
राफेल

जवाबों:


12

विकिपीडिया का विषय पर एक अच्छा लेख है, सूत्रों के साथ पूरा। आपके मैट्रिक्स में मूल्य आवृत्तियों हैं। आपको बस आईडी खोजने की जरूरत है: (log((total documents)/(number of docs with the term))और कई 2 मान।

आर में, आप निम्नानुसार कर सकते हैं:

set.seed(42)
d <- data.frame(w=sample(LETTERS, 50, replace=TRUE))
d <- model.matrix(~0+w, data=d)

tf <- d
idf <- log(nrow(d)/colSums(d))
tfidf <- d

for(word in names(idf)){
  tfidf[,word] <- tf[,word] * idf[word]
}

यहाँ डेटासेट हैं:

> colSums(d)
wA wC wD wF wG wH wJ wK wL wM wN wO wP wQ wR wS wT wV wX wY wZ 
 3  1  3  1  1  1  1  2  4  2  2  1  1  3  2  2  2  4  5  5  4 
> head(d)
  wA wC wD wF wG wH wJ wK wL wM wN wO wP wQ wR wS wT wV wX wY wZ
1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0
2  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0
3  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
4  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0
5  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0
6  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0
> head(round(tfidf, 2))
  wA wC wD wF wG   wH wJ wK wL wM   wN wO wP   wQ wR wS wT   wV  wX  wY wZ
1  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 0.00  0  0  0 0.00 2.3 0.0  0
2  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 0.00  0  0  0 0.00 0.0 2.3  0
3  0  0  0  0  0 3.91  0  0  0  0 0.00  0  0 0.00  0  0  0 0.00 0.0 0.0  0
4  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 0.00  0  0  0 2.53 0.0 0.0  0
5  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 2.81  0  0  0 0.00 0.0 0.0  0
6  0  0  0  0  0 0.00  0  0  0  0 3.22  0  0 0.00  0  0  0 0.00 0.0 0.0  0

आप प्रत्येक शब्द की आईडी भी देख सकते हैं:

> log(nrow(d)/colSums(d))
      wA       wC       wD       wF       wG       wH       wJ       wK       wL       wM       wN       wO       wP       wQ       wR       wS       wT       wV       wX       wY       wZ 
2.813411 3.912023 2.813411 3.912023 3.912023 3.912023 3.912023 3.218876 2.525729 3.218876 3.218876 3.912023 3.912023 2.813411 3.218876 3.218876 3.218876 2.525729 2.302585 2.302585 2.525729 

आपकी सहायताके लिए धन्यवाद! लेकिन क्या प्रत्येक शब्द के लिए कुछ मूल्य प्राप्त करना संभव है जो कुछ भार (पूरे मैट्रिक्स के बजाय) का प्रतिनिधित्व करता है? अब हमारे पास वजन का एक पूरा मैट्रिक्स है। मैं कुछ फीचर का चयन कर रहा हूं और फिल्टर विधि के रूप में tf / idf का उपयोग करना चाहता हूं ...
ABC

परिभाषा के अनुसार @ABC tf-idf वज़न के पूर्ण मैट्रिक्स को संदर्भित करता है। शायद आप अकेले बेकार वजन में रुचि रखते हैं, जो आपको मिलेगा log((number of docs)/(number of docs containing the term))। तुम भी सिर्फ शब्दों को फ़िल्टर कर सकते थे।
Zach

बहुत साफ़! वास्तव में सराहनीय।
ABC

13

पैकेज tm है (टेक्स्ट माइनिंग) http://cran.r-project.org/web/packages/tm/index.html जो आपको ठीक से करना चाहिए:

#read 1000 txt articles from directory data/txt
corpus  <-Corpus(DirSource("data/txt"), readerControl = list(blank.lines.skip=TRUE));
#some preprocessing
corpus <- tm_map(corpus, removeWords, stopwords("english"))
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, stemDocument, language="english")
#creating term matrix with TF-IDF weighting
terms <-DocumentTermMatrix(corpus,control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))

#or compute cosine distance among documents
dissimilarity(tdm, method = "cosine")

आर एक कार्यात्मक भाषा है, इसलिए कोड पढ़ना मुश्किल हो सकता है (उदाहरण के लिए x)


2

आपके कोड में एक त्रुटि है: colSums कॉर्पस में होने की संख्या की गणना करता है, शब्द के साथ ग्रंथों की संख्या नहीं।

इस तरह के एक कंप्यूटिंग संस्करण होगा:

tfidf=function(mat){
  tf <- mat
  id=function(col){sum(!col==0)}
  idf <- log(nrow(mat)/apply(mat, 2, id))
  tfidf <- mat
  for(word in names(idf)){tfidf[,word] <- tf[,word] * idf[word]}
  return(tfidf)
  }


1

मुझे इस पार्टी के लिए देर हो रही है, लेकिन मैं टीसी-आईडीएफ की अवधारणाओं के साथ खेल रहा था (मैं 'अवधारणा' शब्द पर जोर देना चाहता हूं क्योंकि मैंने वास्तविक गणना के लिए किसी भी पुस्तक का पालन नहीं किया था; इसलिए वे कुछ हद तक बंद हो सकते हैं, और निश्चित रूप से; अधिक आसानी से इस तरह के रूप में संकुल के साथ बाहर {tm: Text Mining Package}किया), और मुझे लगता है कि मुझे जो मिला वह इस प्रश्न से संबंधित हो सकता है, या, किसी भी घटना में, यह पोस्ट करने के लिए एक अच्छी जगह हो सकती है।


सेट अप: मैं एक है कोष की 5लंबे समय से प्रिंट मीडिया, से लिया पैराग्राफ text 1के माध्यम से 5जैसे न्यूयॉर्क टाइम्स । कथित तौर पर, यह एक बहुत छोटा "शरीर" है, एक छोटा पुस्तकालय है, इसलिए बोलने के लिए, लेकिन इस "डिजिटल" पुस्तकालय में प्रविष्टियां यादृच्छिक नहीं हैं: फुटबॉल और (सोशल क्लब) के लिए फुटबॉल (या फुटबॉल) के साथ पहली और पांचवीं प्रविष्टियां (?) यहाँ चारों ओर), और अधिक विशेष रूप से सबसे बड़ी टीम के बारे में आज। इसलिए, उदाहरण के लिए, text 1शुरू होता है ...

"पिछले नौ वर्षों में, मेस्सी ने एफसी बार्सिलोना को राष्ट्रीय और अंतर्राष्ट्रीय खिताबों तक पहुंचाया, जबकि अन्य रिकॉर्डों को अलग-अलग तरीके से तोड़ते हुए ...

बहुत अच्छा! दूसरी ओर आप निश्चित रूप से बीच में तीन प्रविष्टियों में सामग्री को छोड़ना चाहते हैं। यहाँ एक उदाहरण है ( text 2):

"पूरे टेक्सास में कुछ घंटों के अंतराल में, श्री रूबियो ने सुझाव दिया कि श्री ट्रम्प ने अपने पतलून में पेशाब किया था और अपने अप्रकाशित ट्विटर संदेशों को टैप करने के लिए अवैध आप्रवासियों का इस्तेमाल किया था ..."

तो क्या सभी लागत से "सर्फिंग" पर से बचने के लिए क्या करना text 1करने के लिए text 2है, जबकि जारी में सर्वशक्तिमान बार्सिलोना एफसी के बारे में साहित्य में आनन्दित करने के लिए text 5?


TC-IDF: मैंने textलंबे वैक्टर में शब्दों को अलग - अलग कर दिया है। फिर प्रत्येक शब्द की आवृत्ति को गिना, पांच वैक्टर (प्रत्येक के लिए एक text) का निर्माण किया, जिसमें केवल संबंधित शब्दों में textगिने गए शब्दों को गिना गया था - अन्य सभी शब्द, अन्य textएस से संबंधित , शून्य पर मूल्यवान थे। text 1उदाहरण के लिए, इसके पहले स्निपेट में , "वेक्टर" मेस्सी शब्द के लिए 1 की गिनती होगी, जबकि "ट्रम्प" में 0. होगा। यह टीसी भाग था।

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

01log(No. documents1+No. docs containing a word) । दस्तावेजों की संख्या 5. यहां वह भाग आता है जो ओपी का जवाब दे सकता है: प्रत्येक निष्क्रिय गणना के लिए, textविचाराधीन को टैली से बाहर रखा गया था । लेकिन अगर कोई शब्द सभी दस्तावेजों में दिखाई देता है, तो इसका आइडी अभी भी था, जो कि हर में लिए धन्यवाद है - उदाहरण के लिए "शब्द" का "महत्व" था, क्योंकि यह सभी में मौजूद था ।01text

के प्रवेश के लिहाज से गुणा हर के लिए था हर शब्द के महत्व को पुस्तकालय आइटम में से हर एक के लिए - स्थानीय रूप से प्रचलित, विश्व स्तर पर दुर्लभ शब्दtc×idftext


घटक: अब इन "शब्द महत्व के वैक्टर" के बीच डॉट उत्पादों के प्रदर्शन की बात थी।

जाहिर, के डॉट उत्पाद text 1के साथ text 5था 13.42645, जबकि text 1वी। text2केवल था 2.511799

क्लंकी आर कोड (नकल करने के लिए कुछ नहीं) यहां है

फिर से, यह एक बहुत अल्पविकसित अनुकरण है, लेकिन मुझे लगता है कि यह बहुत ग्राफिक है।

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