从文本中提取维基百科条目

时间:2012-08-07 09:14:04

标签: python regex wikipedia named-entity-recognition

我有一个大文本,我想解析这个文本并识别(例如本文中存在的维基百科条目)。

我想过使用正则表达式,比如:

pattern='New York|Barak Obama|Russian Federation|Olympic Games'
re.findall(pattern,text)

......等等,但这将是数百万字符长,并且不接受......

我想到的另一种方法是对我的文本进行标记化并为每个标记搜索维基百科条目,但这看起来效率不高,特别是如果我的文字太大了......

有关如何在Python中执行此操作的任何想法吗?

4 个答案:

答案 0 :(得分:1)

另一种方法是获取所有维基百科的文章和页面,然后使用NLTK的Sentence标记器。 将创建的句子逐句放入Lucene索引中,以便每个句子代表Lucene索引中的一个“文档”。

你可以查看所有与“巴拉克奥巴马”的句子,找出句子中的模式。

访问Lucene非常快,我自己使用Lucene索引,包含来自维基百科的4200多万条句子。

要获得氏族维基百科txt文件,您可以从这里下载维基百科作为xml文件:http://en.wikipedia.org/wiki/Wikipedia:Database_download

然后使用UniversitàdiPisa的WikipediaExtractor。 http://medialab.di.unipi.it/wiki/Wikipedia_Extractor

答案 1 :(得分:0)

我会使用NLTKtokenize文本,并在令牌中查找有效的维基百科条目。如果您不想将整个文本存储在内存中,则可以逐行或大小处理文本块。

答案 2 :(得分:0)

你必须用Python做这件事吗? grep --fixed-strings非常适合您想要做的事情,并应该相当有效地完成:http://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html#index-g_t_0040command_007bgrep_007d-programs-175

如果你想用纯Python做这件事,你可能会遇到比以下更快的时间:

for name in articles:
    if name in text:
        print 'found name'

fgrep使用的算法称为Aho-Corasick algorithm,但纯Python实现可能会很慢。

答案 3 :(得分:0)

Gensim库有一个用于~13GB维基百科转储的线程迭代器。因此,如果您遵循特定条款(n-gram),那么您可以编写自定义正则表达式并处理each article of text。可能需要一天的CPU功率才能进行搜索。

如果您在uri来源之后,可能需要调整库。