Одним из способов вывода словаря в виде текстового файла является строка JSON
:
import json
lexnorm = {'nonstandard1': 'standard1', 'nonstandard2': 'standard2', 'nonstandard3': 'standard3'} # etc.
with open('lexnorm.txt', 'w') as f:
json.dump(lexnorm, f)
Смотрите мой комментарий к вашему оригиналу. Я только догадываюсь, что вы пытаетесь сделать:
import json, re
with open('lexnorm.txt') as f:
lexnorm = json.load(f) # read back lexnorm dictionary
with open("corpus.txt", 'r', encoding='utf8') as main, open('new_corpus.txt', 'w') as new_main:
for line in main:
words = re.split(r'[^a-zA-z]+', line)
for word in words:
if word in lexnorm:
line = line.replace(word, lexnorm[word])
new_main.write(line)
Вышеупомянутая программа построчно читает файл corpus.txt
и пытается интеллектуально разбить строку на слова. Разделение на одно пространство не является адекватным. Рассмотрим следующее предложение:
'"The fox\'s foot grazed the sleeping dog, waking it."'
Стандартное разбиение на один пробел дает:
['"The', "fox's", 'foot', 'grazed', 'the', 'sleeping', 'dog,', 'waking', 'it."']
Вы никогда не сможете найти совпадения The
, fox
, dog
ни it
.
Есть несколько способов справиться с этим. Я делю на один или несколько не-буквенных символов. Это может потребоваться «настроить», если слова в lexnorm
состоят из символов, отличных от az:
re.split(r'[^a-zA-z]+', '"The fox\'s foot grazed the sleeping dog, waking it."')
Выход:
['', 'The', 'fox', 's', 'foot', 'grazed', 'the', 'sleeping', 'dog', 'waking', 'it', '']
Как только строка разбита на слова, каждое слово ищется в словаре lexnorm
, и, если оно найдено, выполняется простая замена этого слова в исходной строке. Наконец, строка и любые замены, сделанные для этой строки, записываются в новый файл. Затем вы можете удалить старый файл и переименовать новый.
Подумайте, как вы можете обработать слова, которые будут соответствовать, если бы они были сначала преобразованы в нижний регистр.
Обновить ( Основная оптимизация)
Поскольку в файле может быть много повторяющихся слов, оптимизация заключается в том, чтобы обрабатывать каждое уникальное слово один раз, что можно сделать, если файл не настолько большой, что он невозможно прочитать в память:
import json, re
with open('lexnorm.txt') as f:
lexnorm = json.load(f) # read back lexnorm dictionary
with open("corpus.txt", 'r', encoding='utf8') as main:
text = main.read()
word_set = set(re.split(r'[^a-zA-z]+', text))
for word in word_set:
if word in lexnorm:
text = text.replace(word, lexnorm[word])
with open("corpus.txt", 'w', encoding='utf8') as main:
main.write(text)
Здесь весь файл считывается в text
, разбивается на слова, а затем слова добавляются в набор word_set
, гарантирующий уникальность слов. Затем каждое слово в word_set
ищется и заменяется во всем тексте, а весь текст перезаписывается обратно в исходный файл.