Python:规范化文本文件

时间:2011-09-10 21:33:52

标签: python normalization synonym

我有一个文本文件,其中包含多个单词的多种拼写变体:

例如

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

所以我希望有一个包含单词同义词的同义词文本文件,并希望用主要单词替换所有变体。基本上我想要标准化输入文件。

例如,我的同义词列表文件看起来像

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中编程?

非常感谢你的帮助!!!

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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),则
  3. table[word]会返回table, 如果word不在同义词word中,则只返回table