Я хотел создать двуязычное выравнивание предложений из параллельного корпуса для проекта, над которым я работаю, включая переключение кода. Giza++, старый и надежный ресурс для выравнивания предложений, был создан для работы в системе Linux. Есть несколько руководств по его запуску на Mac, но ни одно из них не работало у меня безупречно. Здесь я подробно описываю, как я заставил систему создавать выровненные предложения, работая в основном с этим руководством, в то же время используя различные хаки и обходные пути со всего Интернета.

1. Создание Гизы++

[1.1] Клонировать Giza++ с GitHub (https://github.com/moses-smt/giza-pp)

[1.2]Измените make-файл Giza++, расположенный по адресу giza-pp/GIZA++-v2/makefile. Отредактируйте строку CFLAGS_OPT следующим образом:

- CFLAGS_OPT = $(CFLAGS) -O3 -funroll-loops -DNDEBUG -DWORDINDEX_WITH_4_BYTE -DBINARY_SEARCH_FOR_TTABLE -DWORDINDEX_WITH_4_BYTE
+CFLAGS_OPT = $(CFLAGS) -O3 -funroll-loops -DNDEBUG -DWORDINDEX_WITH_4_BYTE

[1.3] Изменить giza-pp/GIZA++-v2/model3.cpp для файловой системы без учета регистра. Измените строку 321 следующим образом, чтобы файл .A3.final не был перезаписан файлом .a3.final.

- alignfile = Prefix + “.A3.” + number ;
+ alignfile = Prefix + “.VA3.” + number ;

[1.4] Удалите ссылки на tr1. Mac не поддерживает tr1, но эти модификации (взятые из этого блога) заставят его нормально компилироваться. Перейдите в каталог /giza-pp и запустите:

perl -pi -w -e ‘s/<tr1\//</g;’ GIZA++-v2/* mkcls-v2/*
perl -pi -w -e ‘s/using namespace std::tr1;//g;’ GIZA++-v2/* mkcls-v2/*
perl -pi -w -e ‘s/std::tr1:://g;’ GIZA++-v2/* mkcls-v2/*
sed ‘36d’ mkcls-v2/mystl.h > mkcls-v2/mystl.h.tmp
sed ‘50d’ mkcls-v2/mystl.h.tmp > mkcls-v2/mystl.h
rm mkcls-v2/mystl.h.tmp
make

2. Создание двуязычного корпуса

[2.1]Чтобы загрузить высококачественный, профессионально переведенный двуязычный корпус для большинства европейских языков, перейдите по ссылке http://www.statmt.org/europarl/. Я использовал испанский/английский корпус, хотя подойдет любой.

После распаковки у вас будет два файла: один в L1 (для меня на испанском, расширение файла «.es») и один в L2 (на английском, расширение файла «.en»). Для этого руководства я собираюсь записать все выходные файлы в папку с именем /europarl-es-en/. На данный момент у нас есть:

/europarl-es-en/
   europarl-v7.es-en.en
   europarl-v7.es-en.es

3 . Предварительная обработка текста

Параллельный корпус должен быть токенизирован и лишен всех тегов HTML для работы с Giza++. Это можно сделать с помощью декодера moses, входящего в состав пакета moses SMT.

[3.1]Загрузите декодер Моисея, клонировав его из этого репозитория github.

[3.2] Токенизируйте каждую из языковых пар отдельно с помощью moses, выполнив:

./mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < europarl-v7.es-en.en > europarl-v7.es-en.tok.en
./mosesdecoder/scripts/tokenizer/tokenizer.perl -l es < europarl-v7.es-en.es > europarl-v7.es-en.tok.es

Когда процесс токенизации был завершен, моя папка /europarl-es-en/ содержала следующие файлы:

/europarl-es-en/
   europarl-v7.es-en.en
   europarl-v7.es-en.es
   europarl.v7.es-en.tok.en
   europarl.v7.es-en.tok.es

4. Создание входных файлов

Чтобы запустить Giza, нам понадобятся файлы трех типов: (1) .vcb, содержащий список словарных слов для каждого из двух языков (2) файл .snt (предложения) и (3) .cooc. , или файл совпадений.

По соглашению с Giza вы сначала передаете файлы на исходном языке, а затем на целевом.

[4.1] Чтобы создать файлы .vcb и .snt, выполните:

./plain2snt.out europarl.v7.es-en.tok.en europarl.v7.es-en.tok.es

После запуска моя папка /europarl-es-en/ содержала следующие файлы:

/europarl-es-en/
   europarl-v7.es-en.en
   europarl-v7.es-en.es
   europarl.v7.es-en.tok.en
   europarl.v7.es-en.tok.es
   europarl-v7.es-en.tok.en_europarl-v7.es-en.tok.es.snt
   europarl-v7.es-en.tok.es_europarl-v7.es-en.tok.en.snt
   europarl-v7.es-en.tok.en.vcb
   europarl-v7.es-en.tok.es.vcb

[4.2]Создайте файл .cooc, выполнив следующую команду. Вы можете использовать любой из двух файлов .snt независимо от исходного и целевого языков.

./snt2cooc.out europarl-v7.es-en.tok.en.vcb europarl-v7.es-en.tok.es.vcb europarl-v7.es-en.tok.en_europarl-v7.es-en.tok.es.snt > corp.cooc

5 . Беги по Гизе++

Поскольку GIZA++ создает много выходных файлов, я рекомендую создать новый выходной каталог. Когда будете готовы, бегите:

./GIZA++ -S europarl-v7.es-en.tok.en.vcb -T europarl-v7.es-en.tok.es.vcb -C europarl-v7.es-en.tok.es_europarl-v7.es-en.tok.en.snt -CoocurrenceFile corp.cooc -outputpath [path to output directory]

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

Country pumpkins estaban cantando en el escenario.
NULL ({ 10 13 }) Country ({ 1 2 }) pumpkins ({ 3 }) were ({ 4 }) singing ({ 5 }) on ({ 6 }) the ({ 7 }) stage.