0

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

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

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

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

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

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

4

4 回答 4

1

另一种方法是获取所有 Wikipedia 文章和页面,然后使用 NLTK 的 Sentence tagger。将创建的句子逐句放入 Lucene Index 中,这样每个句子在 Lucene Index 中代表一个自己的“文档”。

例如,您可以查找所有带有“Barak Obama”的句子,以查找句子中的模式。

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

要获取氏族 wikipedia txt 文件,您可以从此处下载 wikipedia 作为 xml 文件:http ://en.wikipedia.org/wiki/Wikipedia:Database_download

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

于 2012-08-09T08:25:06.090 回答
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 算法,但纯 Python 实现可能很慢。

于 2012-08-07T09:22:34.180 回答
0

我会使用NLTK对文本进行标记,并在标记中查找有效的维基百科条目。如果您不想将整个文本存储在内存中,您可以逐行或按大小的文本块工作。

于 2012-08-07T09:18:36.940 回答
0

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

如果您追求 uri 源,您可能需要调整库。

于 2018-01-31T17:13:51.367 回答