在Python中优化查找和匹配代码

时间:2012-10-07 03:14:40

标签: python optimization findall

我有一个代码,它将两个文件作为输入: (1)字典/词典 (2)文本文件(每行一个句子)

我的代码的第一部分读取元组中的字典,因此输出如下内容:

('mthy3lkw', 'weakBelief', 'U')

('mthy3lkm', 'firmBelief', 'B')

('mthy3lh', 'notBelief', 'A')

代码的第二部分是在文本文件中的每个句子中搜索那些元组中位置0的单词,然后打印出句子,搜索词及其类型。

因此,给定句子mthy3lkw和网格3arif,期望的输出是:

鉴于突出显示的单词在字典中找到,

[“mthy3lkw ana mesh 3arif”,“ mthy3lkw ”,“weakBelief”,“U”]。

我的代码的第二部分 - 匹配部分 - 太慢了。如何让它更快?

这是我的代码

findings = [] 
for sentence in data:  # I open the sentences file with .readlines()
    for word in tuples:  # similar to the ones mentioned above
        p1 = re.compile('\\b%s\\b'%word[0])  # get the first word in every tuple
        if p1.findall(sentence) and word[1] == "firmBelief":
            findings.append([sentence, word[0], "firmBelief"])

print findings  

2 个答案:

答案 0 :(得分:1)

将您的元组列表转换为trie,并将其用于搜索。

答案 1 :(得分:1)

构建一个dict查找结构,以便您可以快速从元组中找到正确的结构。然后你可以重构你的循环,这样你就不必遍历你的每个句子的整个字典,试图匹配每个条目,而是翻阅句子中的每个单词并在字典词典中查找:

# Create a lookup structure for words
word_dictionary = dict((entry[0], entry) for entry in tuples)

findings = []
word_re = re.compile(r'\b\S+\b') # only need to create the regexp once
for sentence in data:
    for word in word_re.findall(sentence): # Check every word in the sentence
        if word in word_dictionary: # A match was found
            entry = word_dictionary[word]
            findings.append([sentence, word, entry[1], entry[2]])