Добавить цитату в начале и в конце каждой второй строки, игнорируя пустую строку

Мне нужна помощь в систематизации текстов. У меня есть список тысяч словарей в CSV. Для каждого слова есть термин, определение и образец предложения. Термин и определение разделены табуляцией, а образец предложения – пустой строкой.

Например:

exacerbate  worsen

This attack will exacerbate the already tense relations between the two communities

exasperate  irritate, vex

he often exasperates his mother with pranks

execrable   very bad, abominable, utterly detestable

an execrable performance

Я хочу организовать это так, чтобы образец предложения был заключен в двойные кавычки, не имел пустой строки до и после себя, а термин в предложении заменялся дефисом. Все это меняется при сохранении табуляции после термина, новой строки в начале каждого термина и единственного пробела между определением и примерным предложением. Мне нужен этот формат для импорта его в веб-приложение flashcards.

Желаемый результат на примере выше:

exacerbate  worsen "This attack will – the already tense relations between the two communities"
exasperate  irritate, vex "he often – his mother with pranks"
execrable   very bad, abominable, utterly detestable "an – performance"

Я использую Mac. Я знаю основные командные строки (включая регулярные выражения) и Python, но недостаточно, чтобы разобраться в этом самостоятельно. Если вы могли бы мне помочь, я очень благодарен.


person Vincent    schedule 15.10.2016    source источник
comment
Между определением и примером требуется только пробел? Или там должна быть вкладка?   -  person rubik    schedule 15.10.2016
comment
Только пробел между определением и примерным предложением. Спасибо за разъяснение. Я обновлю свой вопрос.   -  person Vincent    schedule 15.10.2016
comment
Не могли бы вы показать исходный формат CSV   -  person Jacques de Hooge    schedule 15.10.2016


Ответы (4)


Откройте терминал в каталоге, где у вас есть входной файл. Сохраните следующий код в файле .py:

import sys
import string
import difflib
import itertools


with open(sys.argv[1]) as fobj:
    lines = fobj.read().split('\n\n')

with open(sys.argv[2], 'w') as out:
    for i in range(0, len(lines), 2):
        line1, example = lines[i:i + 2]
        words = [w.strip(string.punctuation).lower()
                 for w in example.split()]

        # if the target word is not in the example sentence,
        # we will find the most similar one
        target = line1.split('\t')[0]
        if target in words:
            most_similar = target
        else:
            most_similar = difflib.get_close_matches(target, words, 1)[0]
        new_example = example.replace(most_similar, '-')
        out.write('{} "{}"\n'.format(line1.strip(), new_example.strip()))

Программе требуется имя входного файла и имя выходного файла в качестве аргументов командной строки. То есть выполнить из терминала следующую команду:

$ python program.py input.txt output.txt

где program.py — указанная выше программа, input.txt — ваш входной файл, а output.txt — файл, который будет создан в нужном вам формате.


Я запустил программу на приведенном вами примере. Мне пришлось вручную добавить вкладки, потому что в вопросе есть только пробелы. Это вывод, произведенный программой:

exacerbate  worsen "This attack will - the already tense relations between the two communities"
exasperate  irritate, vex "he often - his mother with pranks"
execrable   very bad, abominable, utterly detestable "an - performance"

Программа корректно заменяет exacerbates тире во втором примере, несмотря на то, что слово exacerbate. Я не могу гарантировать, что этот метод будет работать для каждого слова в вашем файле, не имея файла.

person rubik    schedule 15.10.2016
comment
Потрясающий! Ваша программа работала прекрасно, и я смог без проблем импортировать результаты в веб-приложение для карточек. Благодаря вам я могу тратить больше времени на запоминание слов :) - person Vincent; 15.10.2016
comment
@ Винсент, я рад, что смог помочь! Если вы столкнулись со случаем, когда преобразование было неправильным, пожалуйста, оставьте комментарий, чтобы я мог исправить программу. Например, неправильные глаголы, вероятно, были заменены неправильно. - person rubik; 15.10.2016

Не обязательно пуленепробиваемый, но этот скрипт выполнит эту работу на основе вашего примера:

import sys
import re
input_file = sys.argv[1]


is_definition = True

current_entry = ""
current_definition = ""

for line in open(input_file, 'r'):
    line = line.strip()

    if line != "":
        if is_definition == True:
            is_definition = False

            [current_entry, current_definition] = line.split("\t")

        else:
            is_definition = True

            example = line

            print (current_entry + "\t" + current_definition + ' "' + re.sub(current_entry + r'\w*', "-", line) + '"')

выход:

exacerbate  worsen "This attack will - the already tense relations between the two communities"
exasperate  irritate, vex "he often - his mother with pranks"
execrable   very bad, abominable, utterly detestable "an - performance"

Проблема с нашими нынешними подходами в том, что они не будут работать для неправильных глаголов типа: «идти — пошел» или «принес — принес» или «искать — искал».

person dgg32    schedule 15.10.2016
comment
Но у меня тот же вывод, что и в примере поста. - person dgg32; 15.10.2016
comment
Нет, проверь второй. - person rubik; 15.10.2016
comment
Ааа, так ты не хочешь спряжения. - person dgg32; 15.10.2016
comment
Я не ОП, но я заметил разницу между вашим выводом и тем, что в вопросе. - person rubik; 15.10.2016
comment
Да, неправильные глаголы - это действительно проблема. Я не думаю, что их можно обойти без таблицы неправильных глаголов. - person rubik; 15.10.2016

Пытаться:

suffixList = ["s", "ed", "es", "ing"] #et cetera
file = vocab.read()
file.split("\n")

vocab_words = [file[i] for i in range(0, len(file)-2, 4)]
vocab_defs = [file[i] for i in range(2, len(file), 4)]

for defCount in range(len(vocab_defs)):
    vocab_defs[defCount] = "\"" + vocab_defs[defCount] + "\""

newFileText = ""
for count in range(len(vocab_words)):
    vocab_defs[count] = vocab_defs[count].replace(vocab_words[count].split(" ")[0], "-")
    for i in suffixList:
        vocab_defs[count] = vocab_defs[count].replace("-%s" % i, "-")
    newFileText += vocab_words[count]
    newFileText += "  "
    newFileText += vocab_defs[count]
    newFileText += "\n"

new_vocab_file.write(newFileText)

Выходы:

============== RESTART: /Users/chervjay/Documents/thingy.py ==============
exacerbate  worsen  "This attack will - the already tense relations between the two communities"
exasperate  irritate, vex  "he often - his mother with pranks"
execrable   very bad, abominable, utterly detestable  "an - performance"

>>> 
person rassar    schedule 15.10.2016
comment
Вы должны заменить слово тире в примере. - person rubik; 15.10.2016
comment
Спасибо, что заметили! - person rassar; 15.10.2016
comment
Но теперь у него та же проблема, что и у ответа @ dgg32 :) - person rubik; 15.10.2016

#!/usr/local/bin/python3

import re

with open('yourFile.csv', 'r') as myfile:
    data = myfile.read()    

print(re.sub(r'(^[A-Za-z]+)\t(.+)\n\n(.+)\1[s|ed|es|ing]*(.+)$',r'\1\t\2 "\3-\4"', data, flags = re.MULTILINE))

Выход:

усугубить ухудшить Эта атака будет - и без того напряженные отношения между двумя общинами

раздражать раздражать, раздражать он часто - его мать с шалостями

отвратительный очень плохой, отвратительный, совершенно отвратительный - производительность

person PetrosP    schedule 15.10.2016