Python 与函数 any 和 "more than once" 关键字相关的编码

Python coding relating to function any and "more than once" keyword

我有一段简单的代码可以告诉我给定列表中的单词是否出现在一篇文章中:

 if not any(word in article.text for word in keywords):
        print("Skipping article as there is no matching keyword\n")

我需要的是 "keywords" 列表中至少有 3 个单词出现在文章中 - 如果没有,则应跳过该文章。

有没有简单的方法来做到这一点?我似乎找不到任何东西。

您可以使用此模式计算满足条件的项目数:

sum(1 for x in xs if c(x))

在这里你会做:

if sum(1 for word in keywords if word in article.text) >= 3:
    # 

如果关键字集足够大并且要搜索的字符串足够长,通常值得 short-circuiting,其他方法的变体将在找到三个匹配项时停止(很像 any 找到一个命中时停止):

from itertools import islice

if sum(islice((1 for word in keywords if word in article.text), 3)) == 3:

一旦你得到三个命中,它会立即停止迭代关键字并且测试通过。

My text and lists are pretty long

如果文本很大,关键字很多,那么你可以使用Aho-Corasick algorithm (like grep -Ff keywords.txt text.txt) e.g., if you want to find non-overlapping occurrences, you could use noaho package(未测试):

#!/usr/bin/env python
from itertools import islice
from noaho import NoAho  # $ pip install noaho

trie = NoAho()
for word in keywords:
    trie.add(word)
found_words = trie.findall_long(article.text)
if len(list(islice(found_words, 3))) == 3:
    print('at least 3 words in the "keywords" list appear in the article')