2016-10-15 2 views
1

Мне нужна помощь по организации текстов. У меня есть список тысяч vocabs в 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, но недостаточно, чтобы понять это самостоятельно. Если бы вы могли мне помочь, я очень благодарен.

+0

Между определением и примером требуется только пробел? Или там должна быть вкладка? – rubik

+0

Только пробел между определением и примерным предложением. Спасибо, прося разъяснений. Я уточню свой вопрос. – Vincent

+0

Не могли бы вы отобразить исходный формат CSV –

ответ

1

Открыть терминал в каталог, где у вас есть входной файл. Сохраните следующий код в файле .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. Я не могу гарантировать, что этот метод будет работать для каждого слова в вашем файле без файла.

+0

Awesome! Ваша программа выполнена красиво, и я смог импортировать результаты в веб-приложение с флешками без каких-либо проблем. Благодаря вам я могу потратить больше времени на запоминание словаков :) – Vincent

+0

@ Vincent Я рад, что смог помочь! Если вы столкнулись с ситуацией, когда преобразование было неправильным, оставьте комментарий, чтобы я мог исправить программу. Например, неправильные глаголы, вероятно, были неправильно заменены. – rubik

0

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

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" 

Проблема наших существующих подходов является то, что она не будет работа для нерегулярных глаголов, таких как: «go-go» или «bring-bring» или «seek-seek».

+0

Не работает со вторым примером. – rubik

+0

Но у меня есть тот же результат, что и пример публикации. – dgg32

+0

Нет, проверьте второй. – rubik

0

Try:

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" 

>>> 
+0

Вы должны заменить слово тире в примере. – rubik

+0

Спасибо, что заметили! – rassar

+0

Но теперь у него такая же проблема, как и ответ @ dgg32 :) – rubik

0
#!/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)) 

Выход:

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

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

отвратительный очень плохой, отвратительный, совершенно отвратительный «a - performance»

Смежные вопросы