cfd = nltk.ConditionalFreqDist(
(target,fileid[:4])
for target in ['america']
for fileid in inaugural.fileids()
它工作正常,但我不知道爲什麼在樣品中的每個文件有1?爲什麼ConditionalFreqDist在NLTK中不起作用?
cfd = nltk.ConditionalFreqDist(
(target,fileid[:4])
for target in ['america']
for fileid in inaugural.fileids()
它工作正常,但我不知道爲什麼在樣品中的每個文件有1?爲什麼ConditionalFreqDist在NLTK中不起作用?
這有什麼好做的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的條目數。沒有發生的文件不計數,並且多次發生的次數被計數。
什麼是你的錯誤信息?第二個例子中缺少一個右括號。 – lenz
另外,在第一個例子中,您將計算在所有這些就職文件中出現「美國」和「公民」的次數。在第二個例子中,你計算了有多少文件包含「美國」/「公民」。 – lenz