2017-09-27 25 views
-1

我正在尋找一個函數來獲取某個術語的DF(意思是在一個語料庫中有多少文檔包含某個單詞),但我似乎無法找到函數here。該頁面僅具有獲取tf, idf, and tf_idf值的功能。我只專注於DF。我複製下面的代碼從文檔,爲什麼在NLTK中沒有函數來計算文檔頻率(DF)?

matches = len([True for text in self._texts if term in text])

,但我不喜歡它給出結果。例如,如果我有一個字符串列表,並且正在查找Pete這個詞,它還包括名稱Peter,這不是我想要的。例如。

texts = [['the', 'boy', 'peter'],['pete','the', 'boy'],['peter','rabbit']]

所以我要尋找其出現兩次pete,但我上面顯示的代碼會告訴你,有三個皮特的,因爲它也算peter。我該如何解決這個問題?謝謝。

+0

在您的例子'peter'發生兩次及'pete'只有一次 – erasmortg

+0

作爲一個側面說明,你的第一子列表沒有男孩之間'逗號'和'peter',我沒有編輯,所以你可能會注意到 – erasmortg

+0

@erasmortg oops我沒有意識到這一點。我當場做了這個例子。事實上,我有我自己的名單,這是太長,不能張貼在這裏。感謝您指出了這一點。 –

回答

1

你的描述不正確。您發佈的表達式確實給出1,而不是3,當您在中搜索pete時:

>>> texts = [['the', 'boy', 'peter'],['pete','the', 'boy'],['peter','rabbit']] 
>>> len([True for text in texts if 'pete' in text]) 
1 

你可能會匹配部分單詞的唯一方法是,如果你的文本沒有標記化(即如果texts是字符串列表,而不是令牌列表列表)。

但上面的代碼很糟糕,它根本沒有理由建立一個列表。一個更好的(更傳統)的方法來計算點擊率是這樣的:

>>> sum(1 for text in texts if 'pete' in text)) 
1 
+0

我認爲OPer需要一個stemmer/lemmatizer,魔術提及檢測+實體鏈接設備,附帶一個文檔頻率計數器。不知道爲什麼你的答案被拒絕投票,但**這個答案是正確的**。 – alvas

+0

@alvas我不知道你是不是很諷刺,但我當然不會在stemmer/lemmatization上尋求幫助。無論如何,我認爲這是我需要的答案。非常感謝@ alexis。 –

+1

我不認爲@安娜要求太多!這是一個在詢問之前已經研究過的問題,這個問題涵蓋了「你有什麼嘗試過」的角度,但也許這個問題在背景信息中有一點遺失。很高興我的回答幫助解決了它! – alexis

1

至於你提出的問題(爲什麼(...)?):我不知道。

至於你的榜樣的解決方案(注意peter發生兩次及pete只有一次:

texts = [['the', 'boy', 'peter'],['pete','the', 'boy'],['peter','rabbit']] 
def flatten(l): 
    out = [] 
    for item in l: 
     if isinstance(item, (list, tuple)): 
      out.extend(flatten(item)) 
     else: 
      out.append(item) 
    return out 

flat = flatten(texts) 

len([c for c in flat if c in ['pete']]) 
len([c for c in flat if c in ['peter']]) 

比較兩個結果

編輯:

import collections 
def counts(listr, word): 
    total = [] 
    for i in range(len(texts)): 
     total.append(word in collections.Counter(listr[i])) 
    return(sum(total)) 

counts(texts,'peter') 
#2 
+0

嘿,謝謝你的回答。但我不認爲這就是我特別需要的。如果我將文本改爲'texts = ['''','boy','peter'],['pete','the','boy'],['peter','rabbit','peter' ]]'它會打印出有3個'peter'。我可能應該指定「文檔頻率」是一個術語出現的文檔數量。如果在文檔中某個詞出現100次,它只會計爲1,而不是100.就像在我的例子中,'peter'出現在2個文檔中,所以df = 2雖然在2個文檔中出現3次(文檔是列表)。希望這足夠清楚了嗎?雖然 –

+0

@AnnaRG編輯答案,請參閱第二個函數,我相信這現在給出你想要的結果 – erasmortg

+0

謝謝,它的工作原理。但遺憾的是,我必須得到另一個答案,因爲它更高效。但是你的代碼也很好。 –