2015-09-28 47 views
0
cfd = nltk.ConditionalFreqDist(
    (target,fileid[:4]) 
    for target in ['america'] 
    for fileid in inaugural.fileids() 

它工作正常,但我不知道爲什麼在樣品中的每個文件有1?爲什麼ConditionalFreqDist在NLTK中不起作用?

+0

什麼是你的錯誤信息?第二個例子中缺少一個右括號。 – lenz

+0

另外,在第一個例子中,您將計算在所有這些就職文件中出現「美國」和「公民」的次數。在第二個例子中,你計算了有多少文件包含「美國」/「公民」。 – lenz

回答

0

這有什麼好做的FreqDist。這是關於你的飼料 - 你需要知道generator expressions是如何工作的。

你的情況,這是一個雙向的嵌套發電機。看它像一個for循環:

for target in ['america']: 
    for fileid in inaugural.fileids(): 
     # do something with target and fileid 

在這種情況下,「做一些事情」部分簡單地增加一個對字符串的FreqDist的。字符串對如下所示:

('america', <prefix_of_file_1>) 
('america', <prefix_of_file_2>) 
('america', <prefix_of_file_3>) 
... 

第一個元素總是相同的,因爲在目標列表中只有一個項目。第二個元素由文件ID的前4個字符組成。 你得到完全每個文件一個條目,不管「美」是否是文件或沒有,因爲你不看文件的內容呢,你只是遍歷文件ID。

做的方式,它就像你的原職的第一個例子,你刪除它之前:

cfd = nltk.ConditionalFreqDist(
    (target, fileid[:4]) 
    for target in ['america'] 
    for fileid in inaugural.fileids() 
    for w in inaugural.words(fileid) 
    if w.lower().startswith(target)) 

讓我們一起來看看這款三通嵌套生成器表達式,寫成for循環:

for target in ['america']: 
    for fileid in inaugural.fileids(): 
     for w in inaugural.words(fileid): 
      if w.lower().startswith(target)): 
       # add target and fileid[:4] to the FreqDist 

所以在這裏你遍歷所有單詞(最裏面環路)中的每個文件(中環),以及您爲每個目標做(第一循環;他只有一個,所以沒有太多的循環)。然後你跳過所有不以「美國」開頭的單詞。

例如,假設文件1有「美國」(或者「美國」)的兩次出現,第二個文件沒有提及的目標,第三個文件有3次出現。然後加入FreqDist成對看起來就像這樣:

('america', <prefix_of_file_1>) 
('america', <prefix_of_file_1>) 
('america', <prefix_of_file_3>) 
('america', <prefix_of_file_3>) 
('america', <prefix_of_file_3>) 
... 

所以對於目標的每次出現,你給FreqDist的條目數。沒有發生的文件不計數,並且多次發生的次數被計數。

+0

你應該更進一步,重寫循環,以便它不重讀每個目標詞的整個語料庫。 – alexis

+0

這絕對是我要做的 - 你甚至可以通過爲目標元組提供'str.startswith()'來保存'for'循環。我只是想解釋(以前)給出的代碼,而不是建議更好的代碼。 – lenz

相關問題