Как вывести русские словосочетания(перевод) из англо-русского текста?

РЕГУЛЯРКИ

Хочу упростить себе жизнь, но переводчик по фото не хочет этого.

Идея:

  1. перевести текст с фото
  2. взять текст и вставить в строку
  3. программа должна выделить все русские переводы(словосочетания) после тире до английских слов

Проблема: Встречаются слова с цифрами и английскими буквами в словах. Например: слово Загар переводчик пишет 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 шт):

Автор решения: CrazyElf

Если исходить из предположения, что английские буквы всегда определяются хорошо, а проблемы бывают только с русскими буквами, то такой подход вроде работает:

  • сначала включаем английский
  • по знакам - переключаем на русский
  • с русского на английский переключаем, если после выкидывания знаков пунктуации в слове остаются только английские буквы
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 в русской фразе и всё испортила. Тут надо уже смотреть соседние слова видимо и как-то 'чинить' такие ситуации.

→ Ссылка