2012-08-07 47 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源之後,您可能需要調整庫。