我使用Python Scrapy报废了数百万份报纸文章。现在,我想提取一个包含单词的句子。以下是我的实施。
import nltk
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
for a in articles:
article_sentence = tokenizer.tokenize(a)
for s in article_sentence:
for w in words:
if ' '+w+' ' in s:
sentences[w].append(s)
我有大约1000字。上面的代码效率不高,需要花费很多时间。此外,句子可以包含不同形式的根词(过去时)。我怎样才能有效地提取句子。请帮忙。我需要的任何其他工具?
答案 0 :(得分:2)
这听起来像是Aho-Corasick字符串匹配算法的完美应用。它会同时搜索单个文本(例如您的标记化句子或文档)中的多个字符串。同时搜索将消除初始实现中的内部循环(包括该循环中昂贵的字符串连接)。
我只用Java实现了Aho-Corasick,但是快速的Google搜索产生了几个现有Python实现的链接。例如。: * ahocorasick * pyhocorasick
我没有任何实现(或任何其他选项)的经验,但你可能找到一个满足你的需求 - 或者你自己实现它,如果你觉得这是一个愉快的编码。
我的建议是,在您的词典中包含所有感兴趣的单词形式' trie(要搜索的匹配集)。例如。如果您正在搜索'写',请同时插入'写'并且'写了'进入特里。这将减少您输入文档时需要执行的预处理量。
我还建议搜索尽可能大的文本(一次可能是一个段落或一个完整的文档,而不是一次一个句子),以便更有效地使用每个Aho-Corasick调用。< / p>
答案 1 :(得分:0)
您是否可以发布要解析的文章片段以及您要查找的字词。
根据您的需要,我建议您使用以下内容:
import re
...
...
for s in article_sentence:
sentence_words = re.split('. ;,!?',s) #whatever delimiters you will need
if(set(words) & set(sentence_words)): #find the intersection/union
sentences[w].append(s)