Python: нормализация текстового файла - PullRequest
2 голосов
/ 11 сентября 2011

У меня есть текстовый файл, который содержит несколько вариантов написания многих слов:

Например,

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 ]

3 голосов
/ 11 сентября 2011

Вы можете прочитать файл синонимов и преобразовать его в словарь, 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.
3 голосов
/ 11 сентября 2011

Просто мысль: вместо того, чтобы иметь список всех вариантов слова, взгляните на 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']
...