#python #parsing #translation
#python #синтаксический анализ #перевод
Вопрос:
Я создаю программу, которая должна переводить месяцы года с французского на английский. Я начал с этого кода:
import sys
months_list_fr = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre',
'novembre', 'décembre']
months_list_en = ['january', 'February', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october',
'november', 'december']
months_dict = {
'janvier': 'January',
'février': 'February',
'mars': 'March',
'avril': 'April',
'mai': 'May',
'juin': 'June',
'juillet': 'July',
'août': 'August',
'septembre': 'September',
'octobre': 'October',
'novembre': 'November',
'décembre': 'December'
}
def translate_month(month: str):
month = month.lower()
# Changes value for the month in english in dict
if month in months_list_fr:
month = months_dict[month]
# Simply returns the original english month
elif month in months_list_en:
return month
# There must be a mistake
else:
print_err_n_exit()
return month
def print_err_n_exit():
print(f"There may be a typo in the month or maybe the month is in another language. See module translate.")
sys.exit()
Вот пример использования:
print(translate_month('janvIer'))
Вывод:
January
Process finished with exit code 0
В настоящее время программа будет переводить код только в определенном случае: когда слово появляется точно так же в одном из двух списков (без учета регистра).
Теперь, как насчет случая, когда я делаю ошибку в слове:
print(translate_month('janvUer'))
Или случай, когда я забываю букву:
print(translate_month('janvIe'))
Или снова, если я добавлю букву:
print(translate_month('janvIerz'))
Во всех этих случаях мой код не распознал бы слова и выдал бы сообщение об ошибке. Я думаю, у всех этих случаев есть общая точка зрения: я допустил только одну ошибку в word.
Каким был бы алгоритм, который мог бы подсчитывать ошибки в словах? Если это так, каждая из этих ошибок будет считаться одной ошибкой. Имея возможность их подсчитать, было бы легко перевести слово и исправить ошибку (когда mistakes_count <= 1
) или вывести сообщение об ошибке, когда слово слишком отличается от слов, которые я ищу (когда mistakes_count > 1
).
Комментарии:
1. Возможно, вы захотите прочитать о расстоянии Левенштейна .
2. внимание, никогда не просите «лучшее», основанное на мнении, а затем одну из причин закрыть ваш вопрос
3. Спасибо за вашу помощь, алгоритм очень полезен, и спасибо за советы по изданию.
Ответ №1:
вы можете использовать pyspellchecker, это библиотека, созданная для базовой проверки орфографии. Он также поддерживает несколько языков.
pyspellchecker
поддерживает несколько языков, включая английский, испанский, немецкий, французский и португальский.
Вы также можете настроить библиотеку с учетом регистра или без него, добавив ее в качестве параметра в функцию проверки орфографии SpellChecker(case_sensitive=True)
Чтобы узнать больше: https://pyspellchecker.readthedocs.io/en/latest/, https://readthedocs.org/projects/pyspellchecker/downloads/pdf/latest/
Комментарии:
1. Извините, я больше интересовался логикой этого процесса. Я хотел решить проблему без слишком большого количества пакетов или библиотек.
Ответ №2:
Глядя на вашу цель удаления ошибок, я предлагаю следующее.
Чтобы расширить область ввода, мы используем вещи, называемые регулярными выражениями или регулярными выражениями. Используя их, вы можете сказать, например,
Если ввод пользователя начинается с «j» и заканчивается на «r», они означают «janvier».
Обработайте остальную часть программы соответствующим образом.
Узнайте больше здесь и найдите официальную документацию здесь .
Комментарии:
1. Я думал об использовании регулярных выражений, но, тем не менее, разве это не делает проблему еще больше, поскольку мне пришлось бы указывать все возможные ошибки в каждом отдельном слове? Какие условия проверки вы бы использовали? Вы можете объяснить их на английском языке.