2010-11-17 105 views
0

我試圖處理一個CSV文件,每行都有一個文本字段,組織名稱和該組織內個人的位置作爲非結構化文本。這個字段通常是這樣的文字:命名實體識別與Python/PHP的預設名稱列表

Assoc. Research Professor Dept. Psychology Univ. California Santa Barbara 

我需要取出位置和組織名稱。對於這個職位,我使用preg_match爲不同職業的大約60個不同的正則表達式系列,我認爲它工作得很好(我的猜測是它可以獲得大約80%)。但是,我無法捕捉組織名稱。我有一個大約有16,000個組織名稱的MySQL表,我可以執行一個簡單的preg_match,但由於常見的拼寫錯誤和縮寫,它只能捕獲大約30%的組織。例如,我的數據庫中有

University of California Santa Barbara 

但CSV文件可能有任何的選項:

Univ Cal Santa Barbara 
University Cal-Santa Barbara 
University California-Santa Barbara 
Cal University, Santa Barbara 

我需要處理數十萬條記錄,我不能花時間去糾正當前70%的記錄沒有被正確處理或刻意爲每個組織創建多個別名。我希望能夠做的是捕捉小差異(如小拼寫錯誤,連字符與空格以及常用縮寫),並且如果仍然找不到匹配項,則理想地識別組織名稱並創建新記錄爲了它。

  • Python或PHP中的哪些庫或工具可以執行相似性匹配,從而獲得更廣泛的覆蓋範圍?
  • Python中的NLTK會捕獲拼寫錯誤嗎?
  • 是否有可能使用AlchemyAPI來抓拼寫錯誤的組織?到目前爲止,我只能用它來捕捉拼寫正確的組織
  • 因爲我將一個較短的字符串(組織名稱)與一個較長的字符串(包括名稱加上無關信息)進行比較,是否有任何希望使用PHP的similar_text函數?

任何幫助或見解,將不勝感激。

回答

1

您可以使用difflib計算CSV輸入和規範拼寫之間的相似比,並認爲這是一個比賽,如果它是超過一定的閾值(比如0.65)。

例如:

import difflib 

exact = 'University of California Santa Barbara' 

inputs = ['Univ Cal Santa Barbara', 
      'University Cal-Santa Barbara', 
      'University California-Santa Barbara', 
      'Cal University, Santa Barbara', 
      'Canterbury University'] 

sm = difflib.SequenceMatcher(None, exact) 
ratios = [] 
for input in inputs: 
    sm.set_seq2(input) 
    ratios.append(sm.ratio()) 

print ratios 

給出:

[0.73333333333333328, 0.81818181818181823, 0.93150684931506844, 
0.71641791044776115, 0.33898305084745761] 

注「坎特伯雷大學怎麼還低得多的匹配率()比你給的輸入。

然後,SequenceMatcher.ratio()可能計算速度太慢,超過16,000個值。