我有一个预定义的单词列表;例如:
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
非常感谢愿意帮助的人!
答案 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加权)。