【问题标题】:Count how often words from a list appear in a string计算列表中的单词出现在字符串中的频率
【发布时间】:2018-10-22 16:21:31
【问题描述】:

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

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

非常感谢任何愿意提供帮助的人!

【问题讨论】:

  • 为什么你的单词表是嵌套的?我不认为in 进行深度搜索;这只是一个肤浅的顶级会员测试。
  • 您应该将wordlist 存储在一个集合中,因为它可以让您非常快速地检查集合中是否有某些东西。此外,您将 wordlist 作为列表列表而不是字符串列表。

标签: python python-3.x text nlp


【解决方案1】:

问题出在这里:

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]

【讨论】:

  • 后续跟进:通过计算集合交集,您上面的公式不会计算文本中相同单词(来自列表)的多个实例。它在上面的示例中有效,但是如果语料库中的一个句子是“我有一个苹果和一个香蕉”,那么您的公式将为该句子返回“1”。所以我需要把你关于这个词集的提示和我原来的公式结合起来。
  • @Adam,这有点复杂。您可能想使用Counter(x.split()) 并通过生成器表达式和if 语句提供给sum。试一试,如果您遇到困难,可以提出一个新问题。
【解决方案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)

【讨论】:

  • 谢谢,这行得通,尽管我发现上面 jpp 的答案更有效。不过这很容易理解。
  • @Adam 诚然,是的,jpp 有更好的答案。很高兴你发现我的更容易理解:)
【解决方案3】:

考虑为此也使用collections.Counter

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

假设你已经在你正在做的任何 NLP 中和周围使用sklearn,另一种选择是为此使用sklearnCountVectorizer,然后在事后查看词汇表查看计数:

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
vectorizer.fit(corpus)
vectorizer.vocabulary_

...其中.vocabulary_ 将是一个类似字典的对象,每个单词都有计数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多