問題の定義:長さがn
文字のテキストと、長さがt
の用語リスト(正規表現でもよい)を指定すると、テキスト中の用語のすべての出現を見つけて数えます。ここで式の長いリストの正規表現の最適化
は、そのためのナイーブな実装である:
class WordFrequency(TextAnalysis):
"""Determines the frequency of words from a vocabulary in a given text"""
def __init__(self, vocabulary, text):
"""
:param vocabulary: contains the words (e.g. list)
:param text: the analysed text
"""
self.text = text
self.vocabulary = vocabulary
self.matches = {}
def run(self):
"""
:return: self for method chaining
"""
ltext = self.text.lower()
self.freq = {} # word -> absolute frequency
for word in self.vocabulary:
matches = re.findall(r'\b' + word + r'\b', ltext)
self.matches[word] = [match for match in matches] #.lstrip() for match in matches]
self.freq[word] = len(matches)
return self
は今、これは、長さ約のテキストの約6秒かかります35000文字とca.のリスト5000語であり、これは遅すぎる。 t
の各用語については、テキストを一度スキャンする必要があるため、この時間の複雑さはO(t * n)
であるようです。ここに明白なパフォーマンスバグはありますか?可能な最適化および/またはより良いアルゴリズムは何ですか?
この質問はhttp://codereview.stackexchange.comに移行する必要があります – danidee
なぜあなたのコレクションに一致するリストのコピーを添付していますか?あなたは頻度を知っていますし、あなたは単語を知っています...大文字と小文字を区別したくない場合(あなたは現在ではありません)、オリジナルの一致を保つ必要がない限り。それでも、余分なコピーを作る必要はありません。 'self.matches [word] = matches'ははるかに高速です。 –