2011-09-10 54 views
2

我有一個包含許多詞拼寫幾個變種的文本文件:的Python:標準化的文本文件

對於例如

identification ... ID .. identity...contract.... contr.... contractor...medicine...pills..tables 

所以我想有一個同義詞文本文件,其中包含單詞的同義詞,並希望用主詞替換所有的變體。基本上我想要標準化輸入文件。

對於e.g我的同義詞列表文件看起來像

identification = ID identify 
contracting = contract contractor contractors contra...... 
word3 = word3_1 word3_2 word3_3 ..... word3_n 
. 
. 
. 
. 
medicine = pills tables drugs... 

我想最終的輸出文件看起來像

identification ... identification .. identification...contractor.... contractor.... contractor...medicine...medicine..medicine 

如何得到有關Python編程?

非常感謝您的幫助!

回答

3

您可以閱讀同義詞文件,並將其轉換成一個字典,table

import re 

table={} 
with open('synonyms','r') as syn: 
    for line in syn: 
     match=re.match(r'(\w+)\s+=\s+(.+)',line) 
     if match: 
      primary,synonyms=match.groups() 
      synonyms=[synonym.lower() for synonym in synonyms.split()] 
      for synonym in synonyms: 
       table[synonym]=primary.lower() 

print(table) 

產生

{'word3_1': 'word3', 'word3_3': 'word3', 'word3_2': 'word3', 'contr': 'contracting', 'contract': 'contracting', 'contractor': 'contracting', 'contra': 'contracting', 'identify': 'identification', 'contractors': 'contracting', 'word3_n': 'word3', 'ID': 'identification'} 

接下來,你可以在文本文件中讀取,並從table與其主同義詞替換每個字:

with open('textfile','r') as f: 
    for line in f: 
     print(''.join(table.get(word.lower(),word) 
         for word in re.findall(r'(\W+|\w+)',line))) 

產生

identification  identification identity contracting  contracting  contracting medicine medicine medicine 

  1. re.findall(r'(\w+|\W+)',line)採用分體式每個line而 保留空白。如果空格不感興趣,您可以使用 更容易line.split()
  2. table.get(word,word)回報table[word]如果字是在table, ,只是返回word如果word不是同義詞table
+0

空格拆分會添加尾部標點符號 - 例如「顯示您的ID」。如果以空格分割,將不會給出乾淨的「ID」字符串以轉換爲「標識」。大寫/小寫也需要處理。 – PaulMcG

+1

@Paul McGuire:感謝您的評論。我將'\ s + | \ S +'更改爲'\ w + | \ W +'以將標點符號與單詞分開,並添加了處理大小寫的代碼。 @Pradeep:這些變化不太可能,但可能有問題的後果:同義詞列表中帶有標點符號的單詞(如'can't')將不再匹配,其含義隨着大小寫而變化的單詞('Polish'是國籍,但是'polish '是一個動詞)可能會被相同的同義詞替換。這些問題可以用更多的代碼來處理,但是除非它影響你的情況,否則我們不要這樣做。 – unutbu

+0

謝謝保羅。您的代碼按預期工作。 – Zenvega

3

只是一個想法:與其具有一個單詞的所有變化的列表,看看difflib

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy']) 
['apple', 'ape'] 
>>> import keyword 
>>> get_close_matches('wheel', keyword.kwlist) 
['while'] 
>>> get_close_matches('apple', keyword.kwlist) 
[] 
>>> get_close_matches('accept', keyword.kwlist) 
['except'] 
+0

謝謝你..我需要這種類型的啓發式洗滌。我打算在我正在研究的應用程序稍微更高級的階段研究這一點。 – Zenvega