计算一组空格分隔的单词在句子或tex中出现的次数

2024-06-13 12:54:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个单词组合列表,比如“brown fox”,还有一大堆要检查的句子。我只想知道列表中的元素在句子中出现的次数。

我有一个可行的解决方案,但我想让它更快。所以我只想有一个意见或任何其他方式来做事情。你知道吗

没有区分大小写的。你知道吗

当我的关键字列表很小的时候,我的解决方案效果很好。 如果我的关键词列表是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的输出,这是正确的。你知道吗


Tags: 元素列表line解决方案单词次数句子dark
2条回答

因为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扫描。你知道吗

如果你想提高速度,你可以试着数一数单词,然后对列表/元组中的单词求和。你知道吗

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类型的接近常量的查找时间。你知道吗

相关问题 更多 >