对于列表中的每个bigram,打印次数显示在其他列表中-Python nltk中



我是编码的新手,可以使用帮助。这是我的任务:我有一个在线营销图像标题的CSV。这是一个列。此列中的每个单元格都包含每个广告的营销图像标题文本。这只是一串单词。例如,单元格A1读:" 16个疯狂轮胎失败"等等。

with open('usethis.csv', 'rb') as f:
    mycsv = csv.reader(f)
    mycsv = list(mycsv)

我初始化一个列表:

mylist = []

我的愿望是将文本拿到每个单元格中并提取大兰群。我这样做如下:

for i, c in enumerate(mycsv):
   mylist.append(list(nltk.bigrams(word_tokenize(' '.join(c)))))

myList看起来像这样,但是有更多数据:

[[('16', 'Maddening'), ('Maddening', 'Tire'), ('Tire', 'Fails')], [('16', 'Maddening'), ('Maddening', 'Tire'), ('Tire', 'Fails'), ('Fails', 'That'), ('That', 'Show'), ('Show', 'What'), ('What', 'True'), ('True', 'Negligence'), ('Negligence', 'Looks'), ('Looks', 'Like')]

MyList保留了单个列表,这些列表是我CSV中每个单元格创建的大型列表。

现在,我想循环遍历所有列表中的每个大型,每个bigram旁边打印出它显示在另一个列表(单元格)中的次数。基本上,这将与Excel中的Countif相同。例如,如果第一个列表中的bigram"('16','maddening')"(单元A1)在(myList)中出现3次,则在其旁边打印数字3。依此类推。如果更容易将此信息返回到可以的新列表中。只是在某个地方打印出来。

我已经在线阅读了很多,例如,这种链接符合一个总体想法:如何检查列表的所有元素是否匹配条件?

以及有关字典的链接也相似,因为它要返回每个值旁边的数字,因为我想返回每个bigram旁边的计数。什么是Python字典视图对象?....

,但我真的很茫然。非常感谢您的帮助!让我知道我是否需要更好地解释一些东西。

您可以将collections.Counter用于此任务。由于您已经在使用NLTK,freqdist和派生的类时可能会派上用场,而不仅仅是计数,但是现在让我们坚持使用更简单的Counter

Counterdict的子类,即。它可以做一个字典可以做的,但是它具有其他功能。

以下片段扩展了您显示的代码:

from collections import Counter
bigram_counts = Counter()
for cell in mylist:
    for bigram in cell:
        bigram_counts[bigram] += 1

之后,您可以使用下标,例如。bigram_counts['16', 'Maddening']将返回3或任何实际计数。使用bigram_counts.most_common(5),您可以获得5个最常见的bigrams。

更新

...实际回答问题中的具体问题。

为了了解除一个单元外的所有事件的数量,您需要为每个单元格具有单独的计数器。用以下内容替换上一个片段:

# Populate n+1 counters.
bigram_totals = Counter()
separate_counters = []
for cell in mylist:
    bigram_current = Counter()
    separate_counters.append(bigram_current)
    for bigram in cell:
        bigram_totals[bigram] += 1
        bigram_current[bigram] += 1
# Look up all bigram counts.
for cell, bigram_current in zip(mylist, separate_counters):
    for bigram in cell:
        count = bigram_totals[bigram] - bigram_current[bigram]
        # print(bigram, count) or whatever...

因此,除了总数外,我们还有一个单独的计数器。进行查找时,我们从全局数量中减去本地计数,以获取其他任何地方的事件之和。

顺便说一句,由于您提到了学习目的,因此可以通过利用特殊Counter功能来写下第一个块:

# Populate n+1 counters.
bigram_totals = Counter()
separate_counters = []
for cell in mylist:
    bigram_current = Counter(cell)
    separate_counters.append(bigram_current)
    bigram_totals.update(bigram_current)

我认为这更优雅,但对于初学者来说可能很难理解。自己决定您认为哪个版本更可读。

最新更新