计算Hashtag

时间:2015-01-09 20:28:39

标签: python

我正在编写一个名为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

3 个答案:

答案 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