【问题标题】:search in python for large list在 python 中搜索大列表
【发布时间】:2018-04-13 19:30:40
【问题描述】:

我有两个列表:列表message 和列表keyword。列表message 如下所示:

message = ["my name is blabla",'x-men is a good movie','i deny that fact']
keyword = ['x-men','name is','psycho movie']

我想创建一个新列表,其中包含消息中存在的关键字。

newList = []
for message_index in message:
    print(newList)
    for keyword in keywords:
        if search(r'\b{}\b'.format(keyword), message_index):
            newList.append(keyword)

我的python代码在上面,问题是我的消息列表中的每个句子大约是100到150个单词,列表的长度是3000。每个关键字可能是一两个单词,列表的长度是12000。

所以搜索需要很长时间,有没有更短的方法?

由于两个列表中的数据量很大,所以这个问题有所不同。

【问题讨论】:

标签: python search substring data-processing


【解决方案1】:

内置any()函数:

简单次出现搜索:

message = ["my name is blabla",'x-men is a good movie','i deny that fact']
keyword = ['x-men','name is','psycho movie']

result = [k for k in keyword if any(k in m for m in message)]
print(result)

输出:

['x-men', 'name is']

---------

如果您需要按准确字词搜索:

import re

message = ["my name is blabla",'x-men is a good movie','i deny that fact']
keyword = ['x-men','name is','psycho movie']

result = [k for k in keyword if any(re.search(r'\b{}\b'.format(k), m) for m in message)]

【讨论】:

  • any 将在第一个True 上有效中断
  • 我认为这仍然不能解决一般的性能问题。复杂性仍然是O(M*N),如果不是大多数关键字出现在大多数消息中以使早期中断感觉。
  • @schwobaseggl,我想,set 对象或二进制搜索都不适用于带有单词边界的搜索。随意提出一种更有效的方法
  • 不,但是,还有其他算法可以在 NLP 中查找每个子字符串列表。例如,您可以将关键字列表转换为树结构,并在遍历文本时保持树中的位置。但这似乎超出了这个线程的范围:) 参见例如en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm
  • @RomanPerekhrest 同意!我的意思是没有冒犯。这绝对是对 OP 代码的重大改进。
【解决方案2】:

您可以通过将列表message 加入一个分隔字符串,然后搜索该字符串中的每个关键字,从而显着降低关键字搜索的复杂性:

>>> ms='\t'.join(message)
>>> [e for e in keyword if e in ms]
['x-men', 'name is']

同样的方法适用于具有同样好处的正则表达式:

>>> [e for e in keyword if re.search(r'\b'+e+r'\b', ms)]

这将复杂性从O(M*N) 降低到O(N)...

【讨论】:

    【解决方案3】:

    尝试使用嵌套列表推导

    list = [key for key in keyword for word in message if key in word]
    

    【讨论】:

      猜你喜欢
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2022-11-12
      • 2013-03-06
      • 2019-05-13
      • 2014-05-01
      • 2020-07-11
      相关资源
      最近更新 更多