计算列表中单词出现在字符串中的频率

时间:2018-10-22 16:21:32

标签: python python-3.x text nlp

我有一个预定义的单词列表;例如:

wordlist = [["one"],["two"],["three"]]

我有大量的.txt文件,它们也作为列表导入到python中,例如:

corpus = ["my friend has one potato",
"i have two bananas and three apples",
"my dad has three apples"] 

我想要一个公式,该公式逐行遍历语料库,并告诉我单词列表中每行包含的单词数量;即示例输出为:

1
2
1

我不需要区分单词表中的单词。

但是,我希望它成为一个公式,以便我可以轻松地将其应用于其他单词列表或语料库。

我还没有找到关于SO或其他地方的答案。我尝试过的是:

wordcount_total=list()
for i in range(len(corpus)):
    row=corpus[i]
    wordcount_row=sum(1 for word in row.split() if word in wordlist)
    wordcount_total.append(wordcount_row)

但是,这给了我

0
0
0

非常感谢愿意帮助的人!

3 个答案:

答案 0 :(得分:2)

像这样创建一个辅助函数:

def find_num_occurences(word, string):
    return string.lower().split().count(word)

然后,在要查找的单词字符串中的每个单词上使用此符号:

for word in wordlist:
    word_count = 0
    for line in corpus:
        sum_in_line = find_num_occurences(word, line)
        word_count = word_count + sum_in_line
    print(word_count)

答案 1 :(得分:2)

问题在这里:

sum(1 for word in row.split() if word in wordlist)

word是字符串,但是wordlist字符串列表的列表。两者不可比。

您可以使用itertools.chain展平嵌套列表。您还可以通过计算set交点的长度来简化逻辑:

from itertools import chain

word_set = set(chain.from_iterable(wordlist))
res = [len(word_set & set(line.split())) for line in corpus]

[1, 2, 1]

答案 2 :(得分:1)

为此也考虑使用collections.Counter

counts = collections.Counter()
for line in corpus:
    for word in line.split():
        if word in wordlist:
            counts[word] += 1            

假设您正在使用的sklearn已在所有NLP中或周围使用,则另一种选择是为此使用sklearn的{​​{1}},然后在事实要看词汇才能看清计数:

CountVectorizer

...,其中from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer() vectorizer.fit(corpus) vectorizer.vocabulary_ 是一个类似dict的对象,每个单词都有计数。

后一种方法也可以很好地扩展到其他NLP机制(例如停用词删除,tf-idf加权)。