Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高效地在文本体中搜索大量关键字(1000个)_Python_Arrays_Search_Set - Fatal编程技术网

Python 高效地在文本体中搜索大量关键字(1000个)

Python 高效地在文本体中搜索大量关键字(1000个),python,arrays,search,set,Python,Arrays,Search,Set,我正在从事一个项目,我需要搜索短到中文本体(一个会话中最多100个),以查找1000个不同关键字(股市符号)的存在。我正在使用Python 现在,我知道如果我用一个简单的For循环来处理这个问题,这可能需要很长时间 最有效的方法是什么?是否有一个特定的python库在这里最为有利 编辑:有关我的用例的更多详细信息: 我正在搜索的文本正文是不同长度的Reddit帖子(假设上限长度为2000个字符) 我将搜索大约100-200个不同的职位每届会议 我需要检查每个帖子中是否存在1个或多个股票符号。有

我正在从事一个项目,我需要搜索短到中文本体(一个会话中最多100个),以查找1000个不同关键字(股市符号)的存在。我正在使用Python

现在,我知道如果我用一个简单的For循环来处理这个问题,这可能需要很长时间

最有效的方法是什么?是否有一个特定的python库在这里最为有利

编辑:有关我的用例的更多详细信息:

  • 我正在搜索的文本正文是不同长度的Reddit帖子(假设上限长度为2000个字符)
  • 我将搜索大约100-200个不同的职位每届会议
  • 我需要检查每个帖子中是否存在1个或多个股票符号。有1000个股票符号需要搜索,它们所表示的格式各不相同,因此我需要检查部分匹配(即GOOG和$GOOG在正文中都匹配)
  • 我需要列出在给定帖子中找到的符号
我希望这能提供一些澄清

多谢各位

根据答案发布解决方案:

下面是我最后用来将股票符号编译成正则表达式的基本代码。请注意,这些符号存储在一个名为“self.symbols”的Python Dict中,其中每个键都是一个交换,并包含一个符号列表作为其值

#Return the dict of stock symbols
def compileSymbols(self):

    #Will hold compiled symbols
    dict = {}

    #For each exchange in dict, join list of symbols and convert to compiled regex
    for key in self.symbols.keys():
        joinedStr = "|".join(self.symbols[key])
        dict[key] = re.compile(r"{0}".format(joinedStr))
    
    #Save compiled symbols
    self.symbols = dict
…然后我使用下面的代码循环浏览帖子文本并搜索符号-将结果转换为集合并返回到列表以删除重复项:

#Check posts for matching symbols
def searchPostsForSymbols(self, posts, symbols):

    for post in posts:
    
        #Used to store matching symbols
        matches = []
    
        for exchng in symbols.keys():
            result = symbols[exchng].findall(post, re.M)
            result = list(set(result))
            if len(result) > 0:
                matches.append((exchng, result))

花了几秒钟搜索了1000个符号——性能出奇地好。谢谢马洛的回答

下面是一个使用regexp可以获得的示例。如果对您的情况有用,请尝试并计时:

import re

text = """
This is text with
ThiGOOGs is text with
This is tMICRext with
This is text with
This isGOOG text with
This is text with
"""

c = re.compile(r"STOCK|GOOG|MICR")
r = c.findall(text, re.M)
print(r)
输出为:

['GOOG', 'MICR', 'GOOG']

如果正则表达式更快,您是否尝试过它?这取决于比赛时你想做什么?请提供更多关于您的目标和预期结果的详细信息。@Malo我已用其他信息更新了我的问题。基本上,我需要能够在多达2000个字符的文本体中检测关键字/符号,并列出匹配项。这是一个有趣的问题。现在,我知道如果我用一个简单的For循环来处理这个问题,这可能需要很长时间这向我表明,你并没有试图解决这个问题。如果你能给我们一些东西让我们咬牙切齿的话,那对我们和子孙后代都是有益的。如果您不确定从哪里开始,请查看stackoverflow上关于提问的指南。作为一个起点,如前所述,尝试使用正则表达式(或正则表达式)。您可能对我发布的类似于以下内容的答案感兴趣:请注意,解决方案每个匹配使用1个迭代器,每个迭代器遍历整个字符串,所以这是您可能关心或不关心的额外工作。谢谢!这真的有难以置信的好表现,让我惊讶。。。我已经根据你的答案用我的解决方案更新了这个问题。很高兴知道它有用。如果您设法使用re.compile(…)语句,并且只在循环外使用它一次(并且始终保持相同的符号列表)。如果您只编译一次,您甚至可以将过程加快一点。