2008-12-03 46 views
4

我有一個巨大的名單的人的全名,我必須在巨大的文本中搜索。如何在文本中搜索某人的姓名? (啓發式)

只有部分名稱可能會出現在文本中。有可能是拼寫錯誤,錯誤類型abreviated。文本沒有標記,所以我不知道文本中人名的起始位置。而且我不知道名稱是否會在文本中出現

例子:

我有「巴拉克·侯賽因·奧巴馬」我的列表中,所以我在下面的文本,以檢查該名稱的出現:

  • ...候選人巴拉克奧巴馬當選爲美國總統......(不完整)
  • ...該候選人巴拉克侯賽因當選爲美國總統......(incomp勒特)
  • ...候選人奧巴馬HO當選美國總統......(略)
  • ...候選人奧巴馬ObaNa當選美國總統.. (拼寫錯誤)
  • ...候選人奧巴馬OVama當選美國總統......(misstyped,B毗鄰V)
  • ...候選人麥凱恩失去了選舉...(奧巴馬名字沒有出現)

Certanily沒有爲它確定的解決方案,但...

,這是什麼樣的搜索的一個很好的啓發?如果你不得不,你會怎麼做?

+0

您可以定義「巨大文本」10 ** 12個字節,10 ** 15個字節,更多?有哪些資源可用(電腦時間,電力)? – jfs 2008-12-04 00:06:18

+0

具有200頁+小字體的PDF文檔....做數學! – 2008-12-04 11:38:54

+1

$ pdftotext file.pdf - | wc --chars – jfs 2008-12-04 18:05:33

回答

0

我能想到的最好方法是在python NLTK中定義語法。然而,它可以變得相當複雜,你想要什麼。

我想personnaly去正則表達式,同時用一些編程生成一個排列列表。

5

將空間中的所有內容拆分爲刪除特殊字符(逗號,句號等)。然後使用類似soundex來處理拼寫錯誤。或者,如果您需要搜索大量文檔,則可以使用類似lucene的內容。

1

乍一看,我正在尋找一個索引服務器。 lucene,FAST或Microsoft索引服務器。

0

SQL ServerOracle都有內置的SOUNDEX函數。

另外還有一個SQL Server的內置函數叫做DIFFERENCE,可以使用。

-1

純正的舊正則表達式腳本將完成這項工作。

使用紅寶石,速度相當快。讀線條和匹配單詞。

歡呼聲

2

你想要的是一個自然語言處理庫。你正試圖確定專有名詞的一個子集。如果名稱是專有名詞的主要來源,那麼如果混合其他專有名詞的數目可能會比較容易,那麼名稱是很容易的。如果你正在用JAVA編寫OpenNLP或C#SharpNLP。提取所有專有名詞後,你可以使用Wordnet去除大多數非名字專有名詞。您可以使用wordnet來識別名稱的子部分,如「John」,然後搜索相鄰的令牌來吸取名稱的其他部分。你會遇到類似「John Smith Industries」的問題。您將不得不查看您的基礎數據,以查看是否有可以利用的功能來幫助縮小問題範圍。

使用NLP解決方案是我見過類似問題的唯一真正的強大技術。您可能仍然有問題,因爲200頁實際上相當小。理想情況下,你會有更多的文本,並能夠使用更多的統計技術來幫助消除名稱和非名稱之間的歧義。

6

你說這約200頁。

將它分成200個單頁PDF。

將每個頁面放在Mechanical Turk上,並附上名稱列表。提供每頁約5美元的獎勵。

1

我會使用C#和LINQ。我會在空間中標記所有單詞,然後使用LINQ對文本進行排序(並可能使用Distinct()函數)來隔離我感興趣的所有文本。處理文本時,我會跟蹤索引(您可以使用LINQ來完成),以便我可以重定位原始文檔中的文本 - 如果這是一項要求。