对于列表中的每个bigram,打印它在其他列表中出现的次数-python NLTK
我不熟悉编码,需要帮助。我的任务是: 我有一个csv的在线营销图像标题。它是一列。此列中的每个单元格都包含每个广告的营销图像标题文本。它只是一个字符串。例如,单元格A1显示:“16个令人抓狂的轮胎出现故障”等,以加载csv,我做:对于列表中的每个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 = [] 我的愿望是把每个单元格中的文本提取出来。我的做
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]
。