从大型语料库中提取包含单词的句子,包括标点符号,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.
一次搜索所有字符串的句子的选项
我正在处理一个大语料库 (~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.
一次搜索所有字符串的句子的选项