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

问题描述 投票:1回答:2

我正在使用大型语料库(〜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!']

有什么建议吗?

python regex nlp text-processing corpus
2个回答
0
投票

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

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

0
投票

您的模式会在您可能不喜欢的地方分割句子;例如“ 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探索用于一次搜索所有字符串的句子的选项。

© www.soinside.com 2019 - 2024. All rights reserved.