Проблемы с вложенными циклами ... - PullRequest
1 голос
/ 01 марта 2010

Я собираюсь подробно объяснить вам, чего я хочу достичь.
У меня есть 2 программы о словарях.
Код для программы 1 здесь:

import re
words = {'i':'jeg','am':'er','happy':'glad'}

text = "I am happy.".split()
translation = []

for word in text:
    word_mod = re.sub('[^a-z0-9]', '', word.lower())
    punctuation = word[-1] if word[-1].lower() != word_mod[-1] else ''
    if word_mod in words:
        translation.append(words[word_mod] + punctuation)
    else:
        translation.append(word)
translation = ' '.join(translation).split('. ')
print('. '.join(s.capitalize() for s in translation))

Эта программа имеет следующие преимущества:

  • Вы можете написать более одного предложения
  • Вы получаете первую букву с заглавной буквы после «.»
  • Программа «добавляет» непереведенное слово к выводу («translation = []»)

Вот код для программы 2:

words = {('i',): 'jeg', ('read',): 'leste', ('the', 'book'): 'boka'}
max_group = len(max(words))

text = "I read the book".lower().split()
translation = []

position = 0
while text:
    for m in range(max_group - 1, -1, -1):
        word_mod = tuple(text[:position + m])
        if word_mod in words:
            translation.append(words[word_mod])
            text = text[position + m:]
    position += 1

translation = ' '.join(translation).split('. ')
print('. '.join(s.capitalize() for s in translation))

С помощью этого кода вы можете переводить идиоматические выражения или
«Книга» - «бока».
Вот как программа обрабатывает коды.
Это вывод:

1  
('i',)  
['jeg']  
['read', 'the', 'book']  
0  
()  
1  
('read', 'the')  
0  
('read',)  
['jeg', 'leste']  
['the', 'book']  
1  
('the', 'book')  
['jeg', 'leste', 'boka']  
[]  
0  
()  
Jeg leste boka  

Я хочу внедрить некоторые коды из программы 1 в программу 2.
Я пытался много раз, но безуспешно ...
Вот моя мечта…:
Если я изменю текст на следующий…:

text = "I read the book. I read the book! I read the book? I read the book.".lower().split()  

Я хочу вывод:

Jeg leste boka. Jeg leste boka! Jeg leste boka? Jeg leste boka.  

Так что, пожалуйста, настройте свой мозг и помогите мне с решением ...
Я очень ценю любой ответ!
Заранее большое спасибо!

1 Ответ

0 голосов
/ 17 декабря 2010

Мой поток решений будет примерно таким:

dict = ...
max_group = len(max(dict))
input = ...
textWPunc = input.lower().split()
textOnly = [re.sub('[^a-z0-9]', '', x) for x in input.lower().split()]
translation = []

while textOnly:
    for m in [max_group..0]:
        if textOnly[:m] in words:
            check for punctuation here using textWPunc[:m]
            if punctuation present in textOnly[:m]:
                Append translated words + punctuation
            else:
                Append only translated words
            textOnly = textOnly[m:]
            textWPunc = textWPunc[m:]

join translation to finish 

Ключевой частью является то, что вы держите две параллельные строки текста, одну из которых вы проверяете на наличие слов для перевода, а другую - на пунктуацию, если при поиске перевода возникает хит. Чтобы проверить пунктуацию, я ввел группу слов, которую я изучал, в re () следующим образом: re.sub('[a-z0-9]', '', wordGroup), который удалит все символы, но не будет пунктуации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...