我正在编写一个名为HASHcount(名称,列表)的函数,它接收2个参数,名称一个是名称将被分析的文件,文本文件结构如下:
Date|||Time|||Username|||Follower|||Text
所以,基本上我的输入是推文列表,其中几行结构如上。 list 参数是我想在该文本文件中计算的主题标签列表。我希望我的函数能够检查推文列表中每个单词的出现次数,并将每个单词的字典作为输出,即使单词缺失。
例如,通过指令HASHcount( 12月, [Peace,Love] ),程序应该通过检查单词Peace的次数来输出字典并且Love这个词在被称为12月的文件中的每个推文的文本字段中被用作主题标签。
此外,在词典中,单词必须没有主题标签simbol。
我一直坚持制作这个功能,我现在就在这一点上,但是我有一些关于字典的问题:
def HASHcount(name,list):
f = open(name,"r")
dic={}
l = f.readline()
for word in list:
dic[word]=0
for line in f:
li_lis=line.split("|||")
li_tuple=tuple(li_lis)
if word in li_tuple[4]:
dic[word]=dic[word]+1
return dic
答案 0 :(得分:2)
主要问题是你在每个单词的文件中迭代,而不是反过来。因此,第一个单词将占用文件的所有行,并且每个后续单词将具有0个匹配。
相反,你应该这样做:
def hash_count(name, words):
dic = {word:0 for word in words}
with open(name) as f:
for line in f:
line_text = line.split('|||')[4]
for word in words:
# Check if word appears as a hashtag in line_text
# If so, increment the count for word
return dic
答案 1 :(得分:1)
您的代码存在一些问题,其中一些已经被指出,而其他问题(例如关于在推文文本中标识主题标签)则没有。这是部分解决方案,未涵盖后一问题的优点:
def HASHcount(name, words):
dic = dict.fromkeys(words, 0)
with open(name,"r") as f:
for line in f:
for w in words:
if '#' + w in line:
dic[w] += 1
return dic
这提供了一些简化,主要是因为推文中的主题标签以#
开头(dic
中你不想要的) - 因此它是'不值得分析每一行,因为#
除了文本外不能出现。
然而,它在其他答案中仍有一小部分问题(除了刚刚评论出这个最微妙的部分的那个! - ) - 部分匹配会导致误报。当检查就像word in linetext
一样,问题会很严重 - 例如,如果一个单词是cat
,即使存在于完全普通的文本中(单独存在或作为另一个单词的一部分),它也会被计为主题标签,例如vindicative
)。使用'#' +
方法,它会更好一点,但是,前缀匹配会导致误报,例如#catalog
会被错误地计为cat
的点击。< / p>
正如一些人所说,正则表达式可以帮助解决这个问题。但是,这里是for w in words
循环体的另一种选择......
for w in words:
where = line.find('#' + w)
if where == -1: continue
after = line[where + len(w) + 1]
if after in chars_acceptable_in_hashes: continue
dic[w] += 1
剩下的唯一问题是确定哪些字符可以成为主题标签的一部分,即集合chars_acceptable_in_hashes
- 我没有记住Twitter的规格,所以我不知道随便,但你肯定能找到答案。请注意,这也适用于行尾,因为line
已删除不,因此已知其以\n
结尾。这不在可接受的集合中(因此该行末尾的标签将是&#34;正确终止&#34;)。
答案 2 :(得分:0)
我喜欢使用集合模块。这对我有用。
from collections import defaultdict
def HASHcount(file_to_open, lst):
with open(file_to_open) as my_file:
my_dict= defaultdict(int)
for line in my_file:
line = line.split('|||')
txt = line[4].strip(" ")
if txt in lst:
my_dict[txt] += 1
return my_dict