我是编码的新手,可以使用帮助。这是我的任务:我有一个在线营销图像标题的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
。
Counter
是dict
的子类,即。它可以做一个字典可以做的,但是它具有其他功能。
以下片段扩展了您显示的代码:
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)
我认为这更优雅,但对于初学者来说可能很难理解。自己决定您认为哪个版本更可读。