2012-08-07 26 views
0

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

我想用正则表达式,类似的:

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

...等,但这将是数以百万计的字符长,重不接受......

的我想过的其他方式是标记我的文本和搜索每个令牌的维基百科条目,但这看起来效率不高,尤其是如果我的文本太大...

任何想法如何在Python中做到这一点?

+2

定义“维基百科条目”..你的意思是文本中存在维基百科文章?那么问题可以有多个解决方案,并且是及时动态的! – wim 2012-08-07 09:16:44

+0

是的,我的意思是文章名称基本上是 – hmghaly 2012-08-07 09:18:41

+0

在你给“奥运会”的例子中有一个关于“游戏”和关于“奥林匹克”的wikipedia文章,你会在这种情况下做什么代码?返回3个条目?或只有1?问题是,你将通过不同长度的子串搜索文章,这很杂乱。你最终的结果可能是什么? – 2012-08-07 09:20:54

回答

0

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

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实现可能会很慢。

+0

是的,整个系统是在python中,使用别的东西会很不方便,但是多谢指出。 – hmghaly 2012-08-07 09:43:52

+0

如果你在UNIX系统上运行,你可以从Python调用grep,尽管如果你在窗户会更难。 – 2012-08-07 10:27:05

1

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

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

对Lucene的访问非常快,我自己使用Lucene索引,其中包含来自维基百科的超过42000000个句子。

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

,然后从UNIVERSITA迪比萨使用WikipediaExtractor。 http://medialab.di.unipi.it/wiki/Wikipedia_Extractor

0

Gensim库有一个针对〜13GB维基百科转储的线程迭代器。因此,如果您遵循特定条款(n-grams),则可以编写自定义正则表达式并处理each article of text。搜索可能需要一天的CPU时间。

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