Извлечение предложений, включающих слово из большого корпуса, включая знаки препинания, в python - PullRequest
1 голос
/ 04 апреля 2020

Я работаю с большим корпусом (~ 30 ГБ), и мне нужно извлечь предложения, содержащие список слов (~ 5000), включая знаки препинания. Я использую подход регулярных выражений, но я открыт для любых предложений относительно эффективности метода. Следующий код извлекает предложения, включающие «анархизм», но без знаков препинания, полученные из здесь .

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!']

Есть предложения?

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Ваш шаблон будет разбивать предложения в местах, которые вам, вероятно, не нравятся; например, «Мистер Тамблай» (из-за периода). Вы можете использовать токенизатор предложений из 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 .

1 голос
/ 04 апреля 2020

С [^.!?]* в конце вашего шаблона вы явно исключаете пунктуацию. Если вы уверены, что ваше предложение заканчивается точно одним из [.!?], вы можете просто добавить это к шаблону:

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