Python 检查数百万搜索查询中是否存在大量单词的有效方法 我有一个包含5000万个搜索查询的字符串列表。[1-500+字,每次查询] 我还有一个包含500个单词和短语的字符串列表 我需要返回包含任何单词或短语(2)的搜索查询(1)的索引

Python 检查数百万搜索查询中是否存在大量单词的有效方法 我有一个包含5000万个搜索查询的字符串列表。[1-500+字,每次查询] 我还有一个包含500个单词和短语的字符串列表 我需要返回包含任何单词或短语(2)的搜索查询(1)的索引,python,regex,nlp,Python,Regex,Nlp,目标是只保留与特定主题(电影)相关的查询,然后使用NLP对这些过滤后的查询进行聚类(词干分析->tf_idf->pca->kmeans) 我尝试使用嵌套循环过滤查询,但这需要10个多小时才能完成 filtered = [] with open('search_logs.txt', 'r', encoding='utf-8') as f: for i, line in enumerate(f): query, timestamp = line.strip().split('

目标是只保留与特定主题(电影)相关的查询,然后使用NLP对这些过滤后的查询进行聚类(词干分析->tf_idf->pca->kmeans)

我尝试使用嵌套循环过滤查询,但这需要10个多小时才能完成

filtered = []
with open('search_logs.txt', 'r', encoding='utf-8') as f:
    for i, line in enumerate(f):
        query, timestamp = line.strip().split('\t')
        for word in key_words:
            if word in query:
                filtered.append(i)
我研究了使用regex(word1 | word2 |…| wordN)的解决方案,但问题是我无法将查询组合成一个大字符串,因为我需要过滤不相关的查询

更新:日志和关键字示例

search_logs.txt
'query  timestamp\n'
'the dark knight    2019-02-17 19:05:12\n'
'how to do a barrel roll    2019-02-17 19:05:13\n'
'watch movies   2019-02-17 19:05:13\n'
'porn   2019-02-17 19:05:13\n'
'news   2019-02-17 19:05:14\n'
'rami malek 2019-02-17 19:05:14\n'
'Traceback (most recent call last): File "t.py" 2019-02-17 19:05:15\n'
.......... # millions of other search queries

我会建议,这是发展到非常有效的正是这种任务。只要您搜索的关键字是纯字符串(而不是复杂的正则表达式),它就可以工作。

有这么多数据,您应该需要很长的运行时间。没错,但我怀疑有更有效的方法可以做到这一点。您可以研究多处理,在所有可用的内核上并行运行该算法。Python是单线程的,通常速度很慢,所以我更喜欢用C编写这种多线程应用程序。Regex可能也不是一个面向性能的解决方案。你看到了吗?使用正则表达式trie,您可以创建一个紧凑的正则表达式来精确搜索字符串。
key_words = [
    'movie',
    'movies',
    'cinema',
    'oscar',
    'oscars',
    'george lucas',
    'ben affleck',
    'netflix',
    .... # hundreds of other words and phrases
]