Условно объединить строки в текстовом файле

#python #list #text #slice

Вопрос:

У меня есть текстовый файл, полный распространенных ошибок в написании и их исправлений.

Все орфографические ошибки одного и того же слова должны быть в одной строке.

Я действительно кое-что сделал, но не для всех вариантов написания одного и того же слова.

misspellings_corpus.txt (фрагмент):

 I'de->I'd
aple->apple
appl->apple
I'ed, I'ld, Id->I'd
 

Желанный:

 I'de, I'ed, I'ld, Id->I'd
aple, appl->apple
 

шаблон: wrong1, wrong2, wrongN->correct


Попытка:

 lines = []
with open('/content/drive/MyDrive/Colab Notebooks/misspellings_corpus.txt', 'r') as fin:
  lines = fin.readlines()

for this_idx, this_line in enumerate(lines):
  for comparison_idx, comparison_line in enumerate(lines):
    if this_idx != comparison_idx:
      if this_line.split('->')[1].strip() == comparison_line.split('->')[1].strip():
        #...
 
 correct_words = [l.split('->')[1].strip() for l in lines]
correct_words
 

Комментарии:

1. используйте a collections.defaultdict(list) с ключом вашего правильного написания и добавляйте каждое неправильное написание в качестве значения. затем, как только вы закончите, вы можете записать значения() и ключ, как вам нравится

2. Меня смущает нужный текст. Разве первая строка не должна быть: I'd, I'd, I'd, I'd , а вторая строка также должна быть: apple, apple ?

3. @jrd1 Цель состоит в том , чтобы отделить орфографические ошибки запятой , , а затем -> исправить орфографию. Я добавлю нужный шаблон для публикации.

4. @JonSG Я теперь приложил список correct_words к этому сообщению. Я займусь collections этим вопросом .

Ответ №1:

Храните правильное написание ваших слов в качестве ключей словаря, который сопоставляется с набором возможных ошибок в написании этого слова. Диктант предназначен для того, чтобы вы могли легко найти слово, которое пытаетесь исправить, а набор предназначен для того, чтобы избежать дублирования орфографических ошибок.

 possible_misspellings = {}

with open('my-file.txt') as file:
  for line in file:
    misspellings, word = line.split('->')
    word = word.strip()
    misspellings = set(m.strip() for m in misspellings.split(','))

    if word in possible_misspellings:
      possible_misspellings[word].update(misspellings)
    else:
      possible_misspellings[word] = misspellings
 

Затем вы можете просмотреть свой словарь

 with open('my-new-file.txt', 'w') as file:
  for word, misspellings in possible_misspellings.items():
    line = ','.join(misspellings)   '->'   word   'n'
    file.write(line)
 

Комментарии:

1. Я попробую это сейчас и доложу. Спасибо.

2. Это работает! Тисм. Гипотетически, как я могу избавиться от повторяющихся орфографических ошибок в строке?

3. Этот код также должен избавиться от них. Обратите внимание, что я создаю набор из ошибок в строке, поэтому он также не будет принимать никаких дубликатов.

4. Ааа, хорошо. Снова Тисм.

5. Ключом к избавлению от дубликатов любого рода является использование набора вместо списка, поскольку наборы-это структуры, которые рассматривают элементы как вещи, принадлежащие им или нет. Затем, когда вы попытаетесь добавить элемент, который уже есть в наборе, его состояние по-прежнему будет «принадлежать набору».

Ответ №2:

 lines = []
with open('misspellings_corpus.txt', 'r') as fin:
  lines = fin.readlines()
from collections import defaultdict
my_dict = defaultdict(list)


for line in lines:
    curr_line = line.split("->")[0].replace(" ","")
    if "," in curr_line:
        for curr in curr_line.split(","):
            my_dict[line.split("->")[1].strip()].append(curr)
    else:
        my_dict[line.split("->")[1].strip()].append(curr_line)

for key, values in my_dict.items():
    print(f"{key} -> {', '.join(values)}")