Курсы машинного перевода для языков России/Раздел 4

From Apertium
Jump to navigation Jump to search

Цель данного раздела - описать процессы лексического переноса и лексического выбора. В теоретической части более подробно будет описано почему переносной словарь (или двуязычный словарь)это не всегда лишь соответствие между леммами/частями речи в одном языке и леммами/частями речи в другом языке. В практической части мы добавим три вида записи: один к одному, множество к одному, один к многим.

Теория

Существует два аспекта лексического переноса, первый - выбор наиболее подходящего перевода, второй - маркировка в записях тех особых характеристик, которые должны согласовываться с правилами переноса. Например, выбор наиболее подходящего русского перевода для чувашского слова тӳпе, когда существует несколько вариантов переводов, включая вершина, крыша и небо - это пример первого аспекта, а выбор единственного или множественного числа при переводе русского слова брюки на татарский (например чалбар, чалбарлар) - это пример второго аспекта перевода лексики.

Переводные эквиваленты

Простая модель перевода - это когда вы берете по очереди каждое слово из предложения на языке оригинала, находите переводной эквивалент на языке перевода и заменяете слово. Эта модель проблематична, потому что отношения между словами в языке-источнике и языке перевода, это не один к одному, а множество к множеству, потому что слова могут быть "полисемичны" (многозначны) и этим значениям могут соответствовать различные варианты перевода. Один из способов расширить эту простую модель перевода - снять омонимию со слов, опираясь на лексическую категорию или принадлежность к части речи. Например, киргизское слово жаз может быть как глаголом, так и существительным, что в свою очередь может на русский язык соответственно переводиться как писать или весна.

чувашский русский
тӳпе вершина
тăрă вершина
тӳпе небо
тӳпе крыша
...

Это пример практически соответствия один к одному, значения слова жаз на киргизском и весна на русском соответствуют друг другу. Однако это не всегда так. Может быть так, что не одно, а несколько слов в языке-оригинале будут переводиться одним и тем же словом на язык перевода. Например, оба слова из русского языка вершина и небо могут быть переведены на чувашский как тӳпе. На самом деле, отношения между словами можно описать как множество к множеству.

Для машинного перевода не составляет проблемы запомнить, что вершина, небо и крыша - все слов будут переводиться как тӳпе. Но что saison может быть переведено также как temporada и что тӳпе имеет три (или больше) вариантов перевода на русский - это проблема.

Применение знаний о части речи для разрешения неоднозначности при переводе может частично, но не полностью решить проблему. Даже после того как снята омонимия с части речи, одно слово может иметь несколько вариантов перевода, как в примере с тӳпе. Итак, как же решить проблему один к множеству? Самый очевидный способ - это выбрать наиболее часто встречающийся вариант, или общее значение — в данном случае xxx.

В данное время Apertium имеет экспериментальный модуль для решения проблемы лексического выбора, то есть выбора наиболее подходящего перевода лексической формы языка-источника, предлагая контекст, но использования словосочетаний тоже может быть частичным решением, например в случаях, когда существуют часто встречающиеся коллокации, которые являются исключением по отношению к общему переводу (например, с испанского на французский) : estación del añosaison de l'année).

Диалектные формы

Часто бывает, что диалектные формы одного языка желательно перевести на другой язык в нормативном стиле. Например, из русского языка слово мясо "meat" может быть переведено на чувашский язык как аш, какай, или аш-какай. Первые два варианты перевода считаются более диалектными и в основном употребляются в разговорном языке. Третий вариант более нормативный и более подходит для письменного варианта.

Грамматическое различие

Еще одна проблема лексической передачи - грамматическое различие между двумя языками

  • Слова могут при переводе менять род и число (например, русское слово брюки — множественного числа переводятся на башкирский салбар — единственного числа)
  • Слова в языке-источнике могут иметь омонимию в числе (французское слово temps на испанское tiempo или tiempos) или роде (испанское слово estudiante — может быть мужского или женского рода во французском étudiant, мужской род, étudiante, женский род).
  • Другие характеристики, которые могут быть полезными при лексическом переносе между двумя языками, это является ли переводное существительное абстрактным или исчисляемым — это нужно, например, чтобы решить какой поставить артикль при переводе с языка, где отсутствует категория артикля, на язык, где такая категория присутствует.
  • Также в двуязычном словаре полезно указать, если есть два вида прилагательных, которые изменяют окончания в степенях сравнения и нет.

Обо всем этом необходимо подумать при составлении словаря переноса (двуязычного словаря).

Практика

Для данной практической части будут использоваться примеры из языковой пары татарский-башкирский, поэтому найдите папку apertium-tt-ba. Двуязычный словарь находится в файле apertium-tt-ba.tt-ba.dix. Откройте ее.

Один к одному

Возможно вы помните, что, в первом разделе мы добавили слово чалбар в татарский словарь, мы будем пользоваться этим примером для простых один к одному записей в двуязычном словаре.

Например, найдите запись >песи<,

    <e><p><l>песи<s n="n"/></l><r>бесәй<s n="n"/></r></p></e>

Скопируйте запись и измените лексические формы в языке-источнике и языке перевода, чтобы у вас получилось что-то подобное:

    <e><p><l>песи<s n="n"/></l><r>бесәй<s n="n"/></r></p></e>

    <e><p><l>чалбар<s n="n"/></l><r>салбар<s n="n"/></r></p></e>

Сохраните словарь и выйдите из текстового редактора, мы можем сформировать словарь при помощи следующей команды:

$ lt-comp lr apertium-tt-ba.tt-ba.dix tt-ba.autobil.bin

Давайте протестируем:

$ echo "чалбар" | hfst-proc tt-ba.automorf.hfst  | apertium-tagger -g tt-ba.prob  |\
  apertium-pretransfer | lt-proc -b tt-ba.autobil.bin 
^чалбар<n><nom>/салбар<n><nom>$

Данная команда показывает вам вводимую лексическую форму, и получаемую лексическую форму после ее прохождения через двуязычный словарь.

Множество к одному

Следующая стадия, это осуществить перевод от многих слов к одному слову. Татарское слово морон может быть переведено на башкирский язык как борын, но в настоящий момент данное слово не занесено в словари. Сначала мы ищем слово борын в файле apertium-tt-ba.tt-ba.dix, и мы находим следующую запись:

    <e><p><l>борын<s n="n"/></l><r>танау<s n="n"/></r></p></e>

Мы можем добавить запись для перевода слова моронборын, но для того чтобы это сделать, нам нужно добавить ограничение в направлении перевода, при котором данная запись имеет силу только при переводе с башкирского на татарский. Ограничения добавляются к элементу <e> с описанием r и выделяются цветами, LR слева направо или справа налево RL. Папка называется apertium-tt-ba.tt-ba.dix где татарский вариант слева, а башкирский справа. Итак, если мы хотим, чтобы перевод происходил только в направлении с башкирского на татарский язык нам необходимо добавить ограничение по направлению справа налево(RL). Скопируйте запись и вставьте ее ниже, затем измените лемму и добавьте ограничение.

    <e><p><l>борын<s n="n"/></l><r>танау<s n="n"/></r></p></e>
    <e r="RL"><p><l>борын<s n="n"/></l><r>морон<s n="n"/></r></p></e>

Изучите важность ограничений по направлению перевода в разделе 7Session 7. Теперь сформируйте словарь и протестируйте запись:

$ lt-comp rl apertium-tt-ba.tt-ba.dix ba-tt.autobil.bin 
main@standard 1228 1995

$ lt-comp lr apertium-tt-ba.tt-ba.dix tt-ba.autobil.bin 
main@standard 1226 1990

$ echo "борын" | hfst-proc tt-ba.automorf.hfst  | apertium-tagger -g tt-ba.prob  |\
    apertium-pretransfer | lt-proc -b tt-ba.autobil.bin 
^борын<n><nom>/танау<n><nom>$

$ echo "танау" | hfst-proc ba-tt.automorf.hfst | apertium-tagger -g ba-tt.prob  |\
   apertium-pretransfer | lt-proc -b ba-tt.autobil.bin 
^танау<n><nom>/борын<n><nom>$

$ echo "морон" | hfst-proc ba-tt.automorf.hfst | apertium-tagger -g ba-tt.prob  |\
   apertium-pretransfer | lt-proc -b ba-tt.autobil.bin 
^морон<n><nom>/борын<n><nom>$

Мы используем ограничение по направлению перевода если хотим, чтобы перевод был возможен только в определенном направлении или в случае перевода диалектных и не нормативных форм. Но бывает желательно иметь два возможных перевода.

Один ко множеству

Finnish North Sámi
pitää doallat
pitää berret
pitää liikot
pitää coakcut
pitää galgat

Для данной части практики вы должны находиться в папке apertium-sme-fin. Двуязычный словарь apertium-sme-fin.sme-fin.dix

В данной подпапке мы добавим несколько записей для лексических форм с более чем одним переводом и напишем правила для лексического выбора нестандартного варианта перевода In this subsection we will add some entries for lexical forms with more than one translation, and write lexical selection rules to select the non-default translations.

Возьмем для примера финское слово pitää, мы обнаружим, что данное слово может быть переведено несколькими вариантами на северо-саамский язык, следовательно, чтобы добавить несколько вариантов нестандартного перевода мы делаем следующее so if we want to add some non-default translations of it, we can do it as follows:

  <e c="hold (acc)"><p><l>doallat<s n="V"/><s n="TV"/></l><r>pitää<s n="V"/></r></p><par n="V_V"/></e>
  <e c="ought to"><p><l>berret<s n="V"/><s n="IV"/></l><r>pitää<s n="V"/></r></p><par n="V_V"/></e>
  <e c="like (ela)"><p><l>liikot<s n="V"/><s n="IV"/></l><r>pitää<s n="V"/></r></p><par n="V_V"/></e>
  <e c="get a foothold"><p><l>coakcut<s n="V"/><s n="IV"/></l><r>pitää<s n="V"/></r></p><par n="V_V"/></e>

Если мы хотим добавить перевод galgatpitää, тогда нам нужно сделать еще одну запись, в этот раз с пометкой LR чтобы перевод шел только в направлении из северо-саамского на финский.

  <e r="LR"><p><l>galgat<s n="V"/><s n="IV"/></l><r>pitää<s n="V"/></r></p><par n="V_V"/></e>--><!-- skulle, should -->

Сформируйте словарь обычным способом:


$ lt-comp rl apertium-sme-fin.sme-fin.dix fin-sme.autobil.bin 
main@standard 15454 19523

Внимательно проверьте новые записи следующими способами:

$ echo "Minä pidän kirjan." | hfst-proc fin-sme.automorf.hfst  | cg-proc fin-sme.rlx.bin  | apertium-tagger -g fin-sme.prob  | lt-proc -b fin-sme.autobil.bin 
^Mikä<Pron><Interr><Sg><Ess>/Mii<Pron><Interr><Sg><Ess>$ 
^pitää<V><Act><Ind><Prs><Sg1><@+FMAINV>/berret<V><IV><Ind><Prs><Sg1><@+FMAINV>/liikot<V><IV><Ind><Prs><Sg1><@+FMAINV>/doallat<V><TV><Ind><Prs><Sg1><@+FMAINV>/coakcut<V><IV><Ind><Prs><Sg1><@+FMAINV>$ 
^kirja<N><Sg><Gen><@←OBJ>/girji<N><Sg><Gen><@←OBJ>$^.<Punct><CLB>/.<CLB>$

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

Создайте файл apertium-sme-fin.fin-sme.lrx, и вставьте следующий текст

<rules>
  <rule> 
    <match lemma="pitää" tags="V.*">
      <select lemma="doallat" tags="V.TV.*"/>
    </match>
  </rule>
</rules>

Вы можете создать это правило используя apertium-lrx-comp:

$ apertium-lrx-comp apertium-sme-fin.fin-sme.lrx fin-sme.lrx.bin
1
написано 1 правило, 2 шаблона.

И протестируйте следующим образом:

$ echo "Minä pidän kirjan." | hfst-proc fin-sme.automorf.hfst  | cg-proc fin-sme.rlx.bin  | apertium-tagger -g fin-sme.prob  | lt-proc -b fin-sme.autobil.bin | apertium-lrx-proc fin-sme.lrx.bin 
^Mikä<Pron><Interr><Sg><Ess>/Mii<Pron><Interr><Sg><Ess>$ 
^pitää<V><Act><Ind><Prs><Sg1><@+FMAINV>/doallat<V><TV><Ind><Prs><Sg1><@+FMAINV>$ 
^kirja<N><Sg><Gen><@←OBJ>/girji<N><Sg><Gen><@←OBJ>$^.<Punct><CLB>/.<CLB>$

Как вы видите стандартный перевод doallat был выбран. Ну а если мы хотим выбрать нестандартный перевод в определенном контексте? При последующем исходном падеже в противовес винительному/родительному более подходящим вариантом перевода будет With an elative following as opposed to an accusative/genitive, a better translation is liikot, поэтому давайте добавим для этого правило:

  <rule>
    <match lemma="pitää" tags="V.*">
      <select lemma="liikot" tags="V.*"/>
    </match>
    <match tags="*.Ela"/>
  </rule>

Вы можете снова сделать компиляцию и протестировать это правило на предложении Minä pidän sinusta. "Ты мне нравишься" .

Лексическая выборка

Для использования правил выбора лексики подготовлен отдельный раздаточный материал.

Смотрите также

Для дальнейшего чтения