对于列表中的每个bigram,打印它在其他列表中出现的次数-python NLTK

对于列表中的每个bigram,打印它在其他列表中出现的次数-python NLTK,python,list,nlp,nltk,Python,List,Nlp,Nltk,我不熟悉编码,需要帮助。我的任务是: 我有一个csv的在线营销图像标题。它是一列。此列中的每个单元格都包含每个广告的营销图像标题文本。它只是一个字符串。例如,单元格A1显示:“16个令人抓狂的轮胎出现故障”等,以加载csv,我做: with open('usethis.csv', 'rb') as f: mycsv = csv.reader(f) mycsv = list(mycsv) 我初始化一个列表: mylist = [] 我的愿望是把每个单元格中的文本提取出来。我的做

我不熟悉编码,需要帮助。我的任务是: 我有一个csv的在线营销图像标题。它是一列。此列中的每个单元格都包含每个广告的营销图像标题文本。它只是一个字符串。例如,单元格A1显示:“16个令人抓狂的轮胎出现故障”等,以加载csv,我做:

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中的countifs基本相同。例如,如果第一个列表(单元格A1)中的双字符“('16','Maddening')”在(mylist)中出现了3次,则打印它旁边的数字3。每一个二元图都是如此。如果将这些信息返回到一个新的列表中更容易,那就好了。只是在有意义的地方打印出来

我在网上读了很多书,比如说这个链接有点像是按照一般的思路:

这个关于字典的链接也很相似,它在每个值旁边返回一个数字,因为我想在每个二元数旁边返回一个计数。。

但我真的不知道该怎么做。非常感谢您的帮助!如果需要更好的解释,请告诉我。

您可以使用此任务。 由于您已经在使用NLTK,当您想做的不仅仅是计数时,它可能会派上用场,但现在让我们继续使用更简单的
计数器

计数器
是dict
的一个子类,即它可以做字典能做的任何事情,但它有额外的功能

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

from collections import Counter

bigram_counts = Counter()
for cell in mylist:
    for bigram in cell:
        bigram_counts[bigram] += 1
在此之后,您可以使用下标查找单个bigram,例如,
bigram_计数['16','madding']
将返回
3
或任何实际计数。 使用
bigram\u计数。最常见的(5)
可以得到5个最常见的bigram

更新 。。。回答你问题中的具体问题

为了知道除一个单元格外的所有单元格中出现的次数,需要为每个单元格设置单独的计数器。 将前面的代码段替换为以下内容:

# 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...
因此,除了总计数之外,每个单元格都有一个单独的计数器。 在执行查找时,我们从全局计数中减去局部计数,以获得其他所有位置的发生次数之和

顺便说一句,由于您提到了学习目的,通过利用特殊的
计数器
功能,第一个块可以写得更短一些:

# 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)
我认为这有点优雅,但对于初学者来说可能更难理解。
请自己决定哪个版本更具可读性。

抱歉,刚才我没有完全回答您的问题–这些只是全局计数。您要求的是更复杂的一点,如果您有n个列表,则需要n个计数器。你真的需要知道二元图在所有其他单元格中出现的频率吗?也许你可以提供更多的上下文(为什么你需要这个)。全局计数很好,因为我可以简单地从计数中扣除每个单元格中出现的次数。但是,举一个n个计数器的例子,其中第i个单元格中的出现次数没有计算在内,这将有助于我的学习。我只想探索为什么一些营销标题的点击率高于其他标题。哪些文本特征会触发读者的反应?一个基本理论是,自然地,单词的顺序很重要(因为毕竟所有的文本都是如此),所以我想知道,与其他标题相比,表现更高的标题是否有更多独特的双三角图-其中独特性指向一些单词IDK的正配对,这只是一个值得探索的想法。。。但是你的代码绝对是我想要的,基本上,谢谢!两个for语句可能是我在尝试按以下方式打印结果时遗漏的:def mycounts(列表):对于mylist中的单元格:对于cell中的bigram:return{bigram,bigram_counts(bigram),它表示计数器不可调用。这里的适当方法是什么?注意区分圆括号
()
、方括号
[]
和大括号
{}
——它们有不同的含义。要使用所谓的“下标符号”访问列表/目录的元素/值,请使用括号。
”。连接(c)
毫无意义——看起来这只是获取字符串的一种丑陋的方式,您所说的唯一一列。只需编写
c[0]