0

大きなテキストがあり、このテキストを解析して識別したい (たとえば、このテキスト内に存在するウィキペディアのエントリ)。

次のような正規表現を使用することを考えました。

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

...などですが、これは数百万文字の長さになり、reはそれを受け入れません...

私が考えたもう 1 つの方法は、テキストをトークン化し、トークンごとにウィキペディアのエントリを検索することでしたが、特にテキストが大きすぎる場合、これはあまり効率的ではないように見えます...

Pythonでこれを行う方法はありますか?

4

4 に答える 4

1

もう 1 つの方法は、Wikipedia のすべての記事とページを取得し、NLTK の Sentence tagger を使用することです。作成した文を文ごとに Lucene インデックスに入れ、各文が Lucene インデックス内の独自の「ドキュメント」を表すようにします。

たとえば、「Barak Obama」を含むすべての文を検索して、文のパターンを見つけることができます。

Lucene へのアクセスは非常に高速です。私自身、Wikipedia から 42000000 を超える文を含む Lucene インデックスを使用しています。

一族のウィキペディアの txt ファイルを取得するには、ここからウィキペディアを 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

NLTKを使用してテキストをトークン化し、トークン内の有効なウィキペディア エントリを探します。テキスト全体をメモリ内に保存したくない場合は、行ごとまたはテキスト チャンクのサイズごとに作業できます。

于 2012-08-07T09:18:36.940 に答える
0

Pythonでこれを行う必要がありますか?grep --fixed-stringsあなたがやりたいことにぴったりで、かなり効率的に行う必要があります:

純粋な Python で実行したい場合は、おそらく次のように高速化するのに苦労するでしょう。

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

で使用されるアルゴリズムはAho-Corasick アルゴリズムfgrepと呼ばれますが、純粋な Python の実装は遅くなる可能性があります。

于 2012-08-07T09:22:34.180 に答える