为什么 ConditionalFreqDist 在 NLTK 中不起作用?
Why does ConditionalFreqDist not work in NLTK?
cfd = nltk.ConditionalFreqDist(
(target,fileid[:4])
for target in ['america']
for fileid in inaugural.fileids()
没问题,但我不知道为什么样本在每个文件中都有 1 个?
这与FreqDist无关。重要的是你给它喂了什么——你需要知道 generator expressions 是如何工作的。
在您的例子中,它是一个双向嵌套生成器。看它就像一个 for
循环:
for target in ['america']:
for fileid in inaugural.fileids():
# do something with target and fileid
在这种情况下,"do something" 部分只是将一对字符串添加到 FreqDist。字符串对如下所示:
('america', <prefix_of_file_1>)
('america', <prefix_of_file_2>)
('america', <prefix_of_file_3>)
...
第一个元素总是相同的,因为目标列表中只有一个项目。第二个元素由文件 ID 的前 4 个字符组成。 每个文件你只得到一个条目,不管'america'是否在文件中,因为你不看文件的内容,你只是迭代文件 ID。
方法就像你原来post中的第一个例子,在你删除它之前:
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
所以在这里你遍历每个文件(中间循环)中的所有单词(最内层循环),然后你为每个目标做(第一个循环;这里只有一个所以没有太多循环)。然后你跳过所有不以 "america".
开头的单词
例如,假设文件 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 提供一个条目以进行计数。没有出现的文件不计入,多次出现计入多次
cfd = nltk.ConditionalFreqDist(
(target,fileid[:4])
for target in ['america']
for fileid in inaugural.fileids()
没问题,但我不知道为什么样本在每个文件中都有 1 个?
这与FreqDist无关。重要的是你给它喂了什么——你需要知道 generator expressions 是如何工作的。
在您的例子中,它是一个双向嵌套生成器。看它就像一个 for
循环:
for target in ['america']:
for fileid in inaugural.fileids():
# do something with target and fileid
在这种情况下,"do something" 部分只是将一对字符串添加到 FreqDist。字符串对如下所示:
('america', <prefix_of_file_1>)
('america', <prefix_of_file_2>)
('america', <prefix_of_file_3>)
...
第一个元素总是相同的,因为目标列表中只有一个项目。第二个元素由文件 ID 的前 4 个字符组成。 每个文件你只得到一个条目,不管'america'是否在文件中,因为你不看文件的内容,你只是迭代文件 ID。
方法就像你原来post中的第一个例子,在你删除它之前:
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
所以在这里你遍历每个文件(中间循环)中的所有单词(最内层循环),然后你为每个目标做(第一个循环;这里只有一个所以没有太多循环)。然后你跳过所有不以 "america".
开头的单词例如,假设文件 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 提供一个条目以进行计数。没有出现的文件不计入,多次出现计入多次