cfd = nltk.ConditionalFreqDist(
(target,fileid[:4])
for target in ['america']
for fileid in inaugural.fileids()
它工作正常,但我不知道为什么样本在每个文件中都有1个?
答案 0 :(得分: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))
让我们看看这个三个 -way嵌套的生成器表达式,写成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出现两次“America”(或“American”),第二个文件没有提及目标,第三个文件有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提供一个计数条目。没有出现的文件不计算,多次出现多次计数。