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