为什么 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 提供一个条目以进行计数。没有出现的文件不计入,多次出现计入多次