我正在使用大型语料库(〜30GB),我需要提取包含单词列表(〜5000)包括标点符号的句子。我正在使用正则表达式方法,但是对于该方法的效率我有任何建议。以下代码从here中提取包含“无政府主义”但不带标点符号的句子。
f_in = open(f_path, 'r')
for line in f_in:
sentences = re.findall(r'([^.!?]*anarchism[^.!?]*)', line)
输入:
anarchism, is good. anarchism? anarchism!
实际回报:
['anarchism, is good', ' anarchism', ' anarchism']
预期收益:
['anarchism, is good.', 'anarchism?', 'anarchism!']
有什么建议吗?
在模式结尾处带有[^.!?]*
,您将明确排除任何标点符号。如果您确定句子的结尾恰好是[.!?]
之一,则可以将其添加到模式中:
>>> import re
>>> line = "anarchism, is good. anarchism? anarchism!"
>>> re.findall(r'([^.!?]*anarchism[^.!?]*[.!?])', line)
['anarchism, is good.', ' anarchism?', ' anarchism!']
您的模式会在您可能不喜欢的地方分割句子;例如“ Tamblay先生”(由于期间)。您可以使用nltk
中的句子标记器进行更复杂的拆分。要实际检查句子中是否有任何单词,您当然可以过滤句子标记。
import nltk
sentence_tokenzer = nltk.tokenize.punkt.PunktSentenceTokenizer()
...
for line in f_in:
for start, end in sentence_tokenizer.span_tokenize(line):
sentence = line[start:end]
for keyword in keywords:
if keyword in sentence:
do_something()
如果所有关键字的基本迭代速度太慢,则可以使用Aho-Corasick algorithm探索用于一次搜索所有字符串的句子的选项。