2013-05-15 201 views
-1

我正在嘗試編寫一個腳本,用於統計文件集合中給定令牌列表的出現次數。 到目前爲止,我有以下幾點:For循環,繼續計數

for text in posts: 
    words = wordpunct_tokenize (text) 
    tags = nltk.pos_tag (words) 
    list_tags=defaultdict(int) 
    for a,b in tags: 
     tags3.append(b) 
    for t in tags3: 
     if t in tags_list: 
      list_tags[t]+=1 
    print list_tags 

問題是,如果在以前的帖子中發現的程序不清除標記,和每個崗位只是計數。 在最後一篇文章中,它聲稱在一篇500字的文章中發現了一個給定標記的出現次數爲70.000次。

有沒有人有一個想法我做錯了什麼?

回答

4

您附加一個元組到您的列表:

list_words.append(("foo", "bar", "tiger")) 

因爲拆分text爲單個單詞,就會有永遠words用三個詞的元組針對w in list_wordsTrue。因此,您聲稱您的計數高達70.000不能成立,代碼(如圖所示)只會給您一個空的list_words2字典。

只需直接定義列表:

list_words = ["foo", "bar", "tiger"] 

或者更好的是,使用set快速成員測試:

set_words = {"foo", "bar", "tiger"} 

您的代碼會容易得多,如果你使用collections.Counter(),而不是閱讀:

from collections import Counter  

set_words = {"foo", "bar", "tiger"} 

for text in posts: 
    list_words2 = Counter(word for word in text.split() if word in set_words) 
    print list_words2 

更新你的改變的問題與真正的代碼:

要更新新的標記單詞的列表tags3,通過添加他們不清除列表。對於您處理的每個texttags3都會增長,但是您隨後會從循環中的每個迭代開始開始處理tags3。你的70.000是一個階乘數;第一您處理400級的令牌,則處理另一300個標籤,總共700,則過程100個的額外字,所以現在你遍歷tags 800倍,等等

清除,tags3避免這個問題(例如tags3 = []循環),或者更好的是,循環直接通過tags追加可言:

for text in posts: 
    words = wordpunct_tokenize (text) 
    tags = nltk.pos_tag (words) 
    list_tags = Counter(b for a, b in tags if b in tags_list) 
    print list_tags 

請務必注意tags_list確實是一組,否則b in tags_list測試有地遍歷tags_list eleme每個標籤都有自己的標籤。

+1

所以神祕的是它是如何計數70000次發生的 –

+0

+1只是因爲我沒有意識到'collections.Counter'。 – zwol

+0

@gnibbler:到那裏,表明有問題的代碼不能**可能**添加一個計數器達70,000。 –