计算功能词的频率

2 投票
2 回答
4437 浏览
提问于 2025-04-16 16:35

我想在Python/NLTK中计算功能词的频率。我看到有两种方法可以做到这一点:

  • 使用词性标注工具,统计那些属于功能词的词性标签
  • 创建一个功能词的列表,然后简单查找

第一种方法的问题是,我的数据比较杂乱,我不确定哪些词性标签算是功能词。第二种方法的问题是我没有一个功能词的列表,而且由于我的数据杂乱,查找的结果也不会准确。

我更倾向于第一种方法,或者其他能让我得到更准确结果的方法。

2 个回答

0

你不知道哪种方法有效,直到你尝试过。我推荐第一种方法;我在处理非常嘈杂的数据时用过这个方法,效果不错。那些“句子”其实是电子邮件的主题头(短文本,不是完整的句子),而且语言也不确定(大约85%是英语;Cavnar & Trenkle算法很快就失效了)。这里的成功是指搜索引擎的检索效果提高;如果你只是想统计词频,问题可能会简单一些。

确保你使用的词性标注工具能够考虑上下文(大多数工具都是这样的)。检查你得到的单词和频率列表,可能要去掉一些你认为不是功能词的单词,或者过滤掉一些太长的单词;这样可以减少错误的结果。

(免责声明:我使用的是斯坦福的词性标注工具,而不是NLTK,所以你的情况可能会有所不同。我用的是一个针对英语的默认模型,训练时我想是用的Penn Treebank数据集。)

6

我刚刚使用了LIWC的2007年英语词典(我为此付了钱),现在做了一个简单的查找。欢迎其他任何答案。

我必须说,我对这里几个回答的冲动性有点惊讶。因为有人问要代码。以下是我做的:

''' Returns frequency of function words '''
def get_func_word_freq(words,funct_words):
    fdist = nltk.FreqDist([funct_word for funct_word in funct_words if funct_word in words]) 
    funct_freq = {}    
    for key,value in fdist.iteritems():
        funct_freq[key] = value
    return funct_freq

''' Read LIWC 2007 English dictionary and extract function words '''
def load_liwc_funct():
    funct_words = set()
    data_file = open(liwc_dict_file, 'rb')
    lines = data_file.readlines()
    for line in lines:
        row = line.rstrip().split("\t")
        if '1' in row:
            if row[0][-1:] == '*' :
                funct_words.add(row[0][:-1])
            else :
                funct_words.add(row[0])
    return list(funct_words)

任何在Python中写过代码的人都会告诉你,查找或提取带有特定词性标签的单词并不是很复杂的事情。而且,问题中的NLP(自然语言处理)和NLTK(自然语言工具包)标签应该足以让聪明的人明白。

无论如何,我理解并尊重在这里回复的人的感受,因为大多数都是免费的,但我认为我们至少应该对提问的人表示一点尊重。正如人们所说,帮助别人时会得到帮助,同样,尊重别人时也会得到尊重。

撰写回答