Ошибка преобразования текста от первого лица во второе, игнорируя текст в цитатах "" - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь преобразовать истории / предложения / слова / et c из первого лица в грамматику второго лица, но пытаюсь не преобразовывать текст в кавычки "" или "".

Это выполняется в гугл колабе, python 3 блокнота. Код читает файл в моем googledrive, читает файл .txt, преобразует слова из файла через «forms =» от первого лица ко второму. Существует также проблема, заключающаяся в том, что после преобразования происходит вставка пробелов до и после кавычек ("и").


import nltk
from google.colab import drive

drive.mount('/content/drive')

sent = open('/content/drive/My Drive/storyuno.txt', 'r') 


forms = {"am" : "are", "are" : "am", 'i' : 'you', 'my' : 'yours', 'me' : 'you', 'mine' : 'yours', 'you' : 'I', 'your' : 'my', 'yours' : 'mine'} # More?
def translate(word):
  if word.lower() in forms: return forms[word.lower()]
  return word

translated = []
quote_mode = False
for word in nltk.wordpunct_tokenize(sent.read()):
   if quote_mode:
       translated.append(word)
       if word == '"': quote_mode = False;

   if not quote_mode:
       translated.append(translate(word))
   if word == '"': quote_mode = True;

result = ' '.join(translated)

print(result) 
sent.close()

Вводимая мной история:

Внизу Суть в том, что если я собираюсь рассказать кому-нибудь о лягушке, то это будет Сой. Я решил, что наш путь домой будет самым подходящим временем. «Вы видели что-нибудь снаружи сегодня во время математики?» Я спросил Сою, когда мы начали идти: «Что ты имеешь в виду? Как в небе?» - спросил он, перепрыгивая через трещины на тротуаре: «Я имею в виду прямо за окном. Как будто прямо против него», - ответил я. «Как человек?» - спросил он, все еще прыгая. Сой сидел в ряду, наиболее удаленном от окна, так что было возможно, но вряд ли, чтобы кто-то прошел мимо, не заметив его.

Он преобразуется в:

Суть в том, что если вы собираетесь кому-нибудь рассказать о лягушке, это будет Сой. Вы решили, что наш путь домой будет наиболее подходящим временем. «Я видел что-нибудь снаружи сегодня во время математики?» - спросили вы Соя, когда мы пошли. - Что я имею в виду? Как в небе? - спросил он, перепрыгивая через трещины на тротуаре. - Ты имеешь в виду прямо за окном. Как будто прямо против него, - ответил ты. - Как человек? - спросил он, все еще прыгая. Сой сидел в ряду, наиболее удаленном от окна, так что было возможно, но маловероятно, чтобы кто-то прошел мимо, не заметив его.

Проблема в том, что текст в кавычках НЕ ДОЛЖЕН быть преобразован. Например: я говорю ей: «Ты скучный». ---> Вы говорите ей: «Вы скучный».

Игнорируйте любые ошибки грамматики, кроме проблемы с цитатой, я исправлю ее позже.

1 Ответ

1 голос
/ 07 января 2020

У вас есть две проблемы с цитатой. Во-первых, не равно ". Во-вторых, кавычки можно связывать с соседними знаками препинания, поэтому вы получаете токены, например ?”. Решение состоит в том, чтобы использовать регулярное выражение для проверки наличия любой кавычки в токене:

import re
quote_re = re.compile(r'["“”]')

, а затем изменить

if word == '"':

на

if quote_re.search(word):

Проблема с пробелами может быть исправлена ​​путем детокенизации:

from nltk.tokenize.treebank import TreebankWordDetokenizer
detokenizer = TreebankWordDetokenizer()
result = detokenizer.detokenize(translated)
...