计算在句子或文本中出现多少组以空格分隔的单词

时间:2018-08-02 00:40:13

标签: python string

我有一个单词组合列表,例如“棕狐”和一堆要检查的句子。 我只想查找列表中元素在句子中出现的次数。

我有一个可行的解决方案,但我想使其更快。所以我只想发表意见或采取其他替代方式。

什么都不区分大小写。

当关键字列表很少时,我拥有的解决方案效果很好。 如果我的关键字列表有80个元素,而句子只有两个或三个单词怎么办?会很慢。有什么方法可以改善解决方案吗?

harry_line = "The Dark Lord Voldemort is 
    shooting another shooter who claimed to be Dark Lord."
keywords = ['Dark Lord', 'shooter', 'plan', 'poncho', 'brown fox', 'ugly cake piece']

print(sum(harry_line.count(phrase) for phrase in keywords))

在上面的示例中,“黑魔王”发生了两次,而射击游戏发生了一次,因此输出为3,这是正确的。

2 个答案:

答案 0 :(得分:4)

由于the OP would like a real answer是一种简单的可能性列表,应按顺序尝试:

  1. 使用天真的解决方案
  2. 不,认真,请使用天真的解决方案;您没有足够的机会来解决任何优化问题。使用具有20年历史的图形计算器,扫描两位数范围内的干草堆和针头比眨眼要快。在任何相当现代的硬件上,您甚至应该能够以最快的速度搜索成千上万个大海捞针,甚至比最不耐烦的人都会注意到。
  3. 真的,您确定吗?对于天真的十亿次扫描,in one example case it took 40 minutes表示扫描;如果您执行的扫描次数少于百万次,则您处于较低的单位秒成本范围内。尝试使用幼稚的解决方案,找到您可能会遇到的最大的现实输入集,并找出需要多长时间。时间足够长了吗?没有?使用天真的解决方案。
  4. 叹息...好吧,您尝试过幼稚,但速度太慢。也许consider Aho-Corasick?它将把每个“干草堆”的每个“针头”扫描减少到一个预先计算的步骤,以制作Aho-Corasick自动机,随后无论搜索多少针头,每个“干草堆”都进行一次扫描。如果还不够,请考虑使用multiprocessing模块来并行化Aho-Corasick扫描。

答案 1 :(得分:0)

如果您正在寻找速度,则可以尝试对单词进行计数,然后对列表/元组中的单词求和。

search_words = ['enter', 'your', 'search']
sentence = "enter your sentence here"
counts = dict()
for word in sentence.split():
    if word in counts.keys():
        counts[word] += 1
    else:
        counts[word] = 1
total=0
for word in search_words:
    if word in counts.keys():
        total += counts[word]
print(total)

此方法将仅是O(n),或者可能是O(n×log(n)),而不是您的漂亮的单衬线所做的O(n ^ 2)。它利用dict类型的近恒定查找时间。