Как вывести русские словосочетания(перевод) из англо-русского текста?
РЕГУЛЯРКИ
Хочу упростить себе жизнь, но переводчик по фото не хочет этого.
Идея:
- перевести текст с фото
- взять текст и вставить в строку
- программа должна выделить все русские переводы(словосочетания) после тире до английских слов
Проблема: Встречаются слова с цифрами и английскими буквами в словах. Например: слово Загар переводчик пишет 3аrap (3- цифра или заглавная "зе"; а - русская или английская; r- английская "ар", похожа на "гэ" ) Не Хочется искать и исправлять вручную недочеты. Может быть все исправится качественным сканом фото или другим переводчиком-распознователем Все делаю на тренажере https://regex101.com/r/F8dY80/3 c исходным флагом global и re.IGNORCASE (?i )
НЕДОШАБЛОН:
r"(?i)(?<=-\s)([а-я\W\d])+([a-z]*)(?!=[a-z]+)"
исходный переведенный текст: organize data - сортировать (упорядочить) данные to communicate with other components -- в3aиmодействовaть, c другими компонентами to convey information to the user - пeредавать информацию пользователю to enter data and instructions - Bводить данные и инструкции a small hand held device - маленькое ручное устройство to control the movement of a symbol - контролировать перемещение символа to protect the internal components - защищать внутренние компоненты circuitry in the system unit - сxeмы в системном блоке to interpret and carry out the basic instructions - интерпретировать и выполhять основные инструкции slotted and socket processor - процессоp с разъемом to dissipate the heat - расcеивать тепло the primary circuit board - первичная плата to attach to the motherboard - прикрепить (присоединить) к материнской плате to enable a PC to boot after power-up - осуществить 3arрyзку ПК после включения питания a built-in set of routines - встроенный набор программ to maintain control of hardware settings - поддерживать контроль над настройками long-term storage of data - долгосрочное хранение данных to reflect light off- отражать свет от to convert graphics and text - преобразовывать графику и текст to power every device in a computer - подключить все устройства компьютера
Ответы (1 шт):
Если исходить из предположения, что английские буквы всегда определяются хорошо, а проблемы бывают только с русскими буквами, то такой подход вроде работает:
- сначала включаем английский
- по знакам
-переключаем на русский - с русского на английский переключаем, если после выкидывания знаков пунктуации в слове остаются только английские буквы
from string import ascii_lowercase, punctuation
set_punctuation = set(punctuation)
set_ascii_lowercase = set(ascii_lowercase)
text = "organize data - сортировать (упорядочить) данные to communicate with other components -- в3aиmодействовaть, c другими компонентами to convey information to the user - пeредавать информацию пользователю to enter data and instructions - Bводить данные и инструкции a small hand held device - маленькое ручное устройство to control the movement of a symbol - контролировать перемещение символа to protect the internal components - защищать внутренние компоненты circuitry in the system unit - сxeмы в системном блоке to interpret and carry out the basic instructions - интерпретировать и выполhять основные инструкции slotted and socket processor - процессоp с разъемом to dissipate the heat - расcеивать тепло the primary circuit board - первичная плата to attach to the motherboard - прикрепить (присоединить) к материнской плате to enable a PC to boot after power-up - осуществить 3arрyзку ПК после включения питания a built-in set of routines - встроенный набор программ to maintain control of hardware settings - поддерживать контроль над настройками long-term storage of data - долгосрочное хранение данных to reflect light off- отражать свет от to convert graphics and text - преобразовывать графику и текст to power every device in a computer - подключить все устройства компьютера"
result = []
rus_eng = {'eng': [], 'rus': []}
idx = 'eng'
for word in text.split():
if idx == 'eng':
if set(word) == set('-'):
idx = 'rus'
continue
set_word = set(word)
set_letters = set_word - set_punctuation
if not set_letters:
continue
if idx == 'rus' and not (set_letters - set_ascii_lowercase):
result.append([' '.join(words) for words in rus_eng.values()])
rus_eng = {'eng': [], 'rus': []}
idx = 'eng'
rus_eng[idx].append(word)
result.append([' '.join(words) for words in rus_eng.values()])
print(result)
Вывод:
[['organize data', 'сортировать (упорядочить) данные'],
['to communicate with other components', 'в3aиmодействовaть,'],
['c другими компонентами to convey information to the user',
'пeредавать информацию пользователю'],
['to enter data and instructions', 'Bводить данные и инструкции'],
['a small hand held device', 'маленькое ручное устройство'],
['to control the movement of a symbol', 'контролировать перемещение символа'],
['to protect the internal components', 'защищать внутренние компоненты'],
['circuitry in the system unit', 'сxeмы в системном блоке'],
['to interpret and carry out the basic instructions',
'интерпретировать и выполhять основные инструкции'],
['slotted and socket processor', 'процессоp с разъемом'],
['to dissipate the heat', 'расcеивать тепло'],
['the primary circuit board', 'первичная плата'],
['to attach to the motherboard',
'прикрепить (присоединить) к материнской плате'],
['to enable a PC to boot after power-up',
'осуществить 3arрyзку ПК после включения питания'],
['a built-in set of routines', 'встроенный набор программ'],
['to maintain control of hardware settings',
'поддерживать контроль над настройками'],
['long-term storage of data', 'долгосрочное хранение данных'],
['to reflect light off- отражать свет от to convert graphics and text',
'преобразовывать графику и текст'],
['to power every device in a computer',
'подключить все устройства компьютера']]
Как видно, проблемы всё-равно есть - попалась английская c в русской фразе и всё испортила. Тут надо уже смотреть соседние слова видимо и как-то 'чинить' такие ситуации.