从大型语料库中提取包含单词的句子,包括标点符号,python

Extracting sentences including a word from large corpus, including the punctuation, in python

我正在处理一个大语料库 (~30GB),我需要提取包含单词列表 (~5000) 的句子,包括标点符号。 我正在使用正则表达式方法,但我对有关该方法效率的任何建议持开放态度。下面的代码提取了包含'anarchism'但没有标点符号的句子,从here.

中得到
f_in = open(f_path, 'r')
for line in f_in:
    sentences = re.findall(r'([^.!?]*anarchism[^.!?]*)', line)

输入:

anarchism, is good. anarchism? anarchism!

实际 return:

['anarchism, is good', ' anarchism', ' anarchism']

预期 return:

['anarchism, is good.', 'anarchism?', 'anarchism!']

有什么建议吗?

在模式末尾使用 [^.!?]*,您明确排除了任何标点符号。如果您确定您的句子恰好以 [.!?] 之一结尾,您可以将其添加到模式中:

>>> import re
>>> line = "anarchism, is good. anarchism? anarchism!"
>>> re.findall(r'([^.!?]*anarchism[^.!?]*[.!?])', line)
['anarchism, is good.', ' anarchism?', ' anarchism!']

您的模式会在您可能不喜欢的地方拆分句子;例如,"Mr. 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.

一次搜索所有字符串的句子的选项