Совершенно новые турецкие модели spaCy обучены, упакованы и ждут, чтобы их можно было использовать в ваших наборах данных. Давайте посмотрим на них в действии!

Несмотря на то, что турецкий язык является широко распространенным языком в Азии и Европе, где говорят более 80 миллионов человек, лингвистических ресурсов на турецком языке не так много. Найти современную предварительно обученную модель было совсем непросто, а синтетический характер турецкого языка создает множество проблем для тех, кто заинтересован в подготовке предварительно обученных моделей для сообщества. К счастью, в моей зимней кампании «НЛП с Дуйгу» есть много ресурсов, включая предварительно обученные языковые модели spaCy!

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

Пакеты

Турецкие модели spaCy представлены в трех вариантах: tr_core_web_md , tr_core_web_lg и tr_core_web_trf . tr_core_web_lg — это модель большого размера на основе CNN, которая обеспечивает хорошую точность и работает с приличной скоростью. tr_core_web_md имеет ту же архитектуру, но векторы на один размер меньше (мы к этому придем). tr_core_web_trf — конвейер на основе Transformer. Он предлагает высокую точность, и если у вас есть хорошие вычислительные ресурсы (даже лучше некоторые графические процессоры), это должно быть вашим оружием.

Все конвейеры содержат токенизатор, обучаемый лемматизатор, POS-теггер, анализатор зависимостей, морфологизатор и компоненты NER. Все модели доступны для скачивания в репозитории Hugging Face [1].

Компоненты трубопровода

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

pip install https://huggingface.co/turkish-nlp-suite/tr_core_news_trf/resolve/main/tr_core_news_trf-any-py3-none-any.whl

Метод pipe_names покажет нам доступные компоненты пайплайна:

>>> import spacy
>>> nlp = spacy.load("tr_core_news_trf")
>>> nlp.pipe_names

['transformer',
 'tagger',
 'morphologizer',
 'trainable_lemmatizer',
 'parser',
 'ner']

Две другие модели имеют те же компоненты, за исключением transformer — вместо них tok2vec.

После изучения компонентов конвейера мы готовы запустить несколько предложений через наш конвейер 😊. Давайте начнем с короткого примера предложения:

>>> sentence = "Ben de Ankara'ya gittim."
>>> doc = nlp(sentence)

>>> for token in doc:
      print(token.text, token.pos_, token.dep_, token.lemma_, token.morph)

Ben PRON nsubj ben Case=Nom|Number=Sing|Person=1
de CCONJ advmod:emph de 
Ankara'ya PROPN obl Ankara Case=Dat|Number=Sing|Person=3
gittim VERB ROOT git Aspect=Perf|Evident=Fh|Number=Sing|Person=1|Polarity=Pos|Tense=Past
. PUNCT punct . 

Мы можем видеть результаты каждого компонента 1 на 1. Во втором столбце показаны POS-теги, сгенерированные компонентом tagger. В предложении есть местоимение, союз, имя собственное и глагол. В третьем столбце показаны метки зависимостей, это примерно читается как подлежащее глагола, наречие глагола, косвенное дополнение глагола и сам глагол. Четвертый и пятый столбцы связаны с морфологией, метод token.lemma_ демонстрирует лемму токена, а token.morph предлагает полный морфологический анализ токена, включая все типы флективных суффиксов и дополнительную информацию (подробнее о морфологии будет в другом посте). Если вы хотите узнать больше о турецкой морфологии и синтаксисе, я напишу пост о каждом из них. Вы также можете посетить мой плейлист «Все о турецкой лингвистике» [3]. В этой статье мы только бегло познакомились — чтобы полностью понять структуру предложений и словоформы на турецком языке, нужно приложить немного усилий 😄

В результате дерево зависимостей этого предложения выглядит так:

Как насчет компонента NER? NER помечает единственную сущность предложения как GPE , сущность типа места:

Турецкие модели spaCy обучаются на турецком наборе данных Wiki NER, который имеет 19 тегов. Это набор данных NER общего назначения, поэтому набор тегов включает общие типы сущностей, такие как человек, место, названия организаций, а также числовые типы сущностей. Полный набор тегов можно найти на страницах набора данных Github и Hugging Face [4].

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

>>> sentence = "Ankara Esenboğa Havaalanı'ndan ayrılan uçak 1 saat gecikmeyle saat 17:00 civarı İstanbul'a indi."
>>> doc = nlp(sentence)

>>>for token in doc:
     print(token.text, token.pos_, token.dep_, token.lemma_, token.morph)

Ankara PROPN obl Ankara Case=Nom|Number=Sing|Person=3
Esenboğa PROPN flat Esenboğa Case=Nom|Number=Sing|Person=3
Havaalanı'ndan NOUN flat Havaalan Case=Abl|Number=Sing|Number[psor]=Sing|Person=3|Person[psor]=3
ayrılan VERB acl ayrıl Polarity=Pos|Tense=Pres|VerbForm=Part
uçak NOUN nsubj uçak Case=Nom|Number=Sing|Person=3
1 NUM nummod 1 NumType=Card
saat NOUN obl saat Case=Nom|Number=Sing|Person=3
gecikmeyle NOUN obl gecikme Case=Ins|Number=Sing|Person=3
saat NOUN obl saat Case=Nom|Number=Sing|Person=3
17:00 NUM obl 17:00 NumType=Card
civarı ADJ obl civar Case=Nom|Number=Sing|Number[psor]=Sing|Person=3|Person[psor]=3
İstanbul'a PROPN obl İstanbul Case=Dat|Number=Sing|Person=3
indi VERB ROOT in Aspect=Perf|Evident=Fh|Number=Sing|Person=3|Polarity=Pos|Tense=Past
. PUNCT punct . 

Обратите внимание на форму причастия ayrılan, которая образует предложение «Ankara Esenboğa Havaalanı’ndan ayrılan» для изменения существительного «uçak». Это предложение выглядит следующим образом в дереве разбора предложения:

Как насчет сущностей? Это предложение включает в себя четыре сущности трех разных типов: два времени, одно известное здание и один город:

И деревья синтаксического анализа, и аннотации сущностей выглядят красиво и удобно, однако красота всегда достигается с некоторыми усилиями. Когда дело доходит до обработки, у турецкого есть свои проблемы.

Проблемы с обработкой турецкого языка

По моему опыту, первая проблема турецкого языка — найти хороший банк деревьев для обучения компонентов синтаксического анализатора, тегировщика и морфологизатора. Для нашей космической миссии я использовал турецкий BOUN Treebank [5]. Это отличный банк деревьев с коммерческой лицензией.

Вторая проблема исходит от самого турецкого языка, турецкий язык имеет довольно сложную и репродуктивную морфологию. Мы уже видели некоторые примеры словоформ выше, при более детальном рассмотрении мы можем заметить «длинные» строки морфологии:

gittim VERB ROOT git Aspect=Perf|Evident=Fh|Number=Sing|Person=1|Polarity=Pos|Tense=Past7
Ankara'ya PROPN obl Ankara Case=Dat|Number=Sing|Person=3
Havaalanı'ndan NOUN flat Havaalan Case=Abl|Number=Sing|Number[psor]=Sing|Person=3|Person[psor]=3

Качество и количество банка деревьев здесь имеют решающее значение, такие морфологические особенности трудно изучить даже для самых мощных НС. Во время обучения необходимо показать достаточное количество примеров глагольных форм, глагольных суффиксов, а также именных форм и именных суффиксов. Это составляет довольно много учебных примеров для турецкого языка 😄. Синтаксис идет рука об руку с морфологией (так же, как в примере с прилагательным предложением), объединение морфосинтаксиса является главной проблемой турецкого языка.

Представления подслов, векторы Флорета и преобразователи

Как мы видим выше, к турецкому корню можно добавить произвольное количество суффиксов. В результате турецкие словоформы состоят из множества морфем и могут быть довольно длинными строками. Чтобы правильно векторизовать турецкий текст, безусловно, нужны стратегии подслов.

Токенизаторы типа Transformers начали революцию, разбивая слова на несколько частей слов, чтобы представлять даже самые редкие элементы языка, поэтому вообще не оставляя места для OOV. Словари, состоящие из частей слова, весьма полезны и для турецкого языка, так как вы можете догадаться, что слова любят разлагаться на более мелкие части (стратегии разложения словоформ будут описаны в другой статье). Как мы уже отмечали, tr_core_web_trf — это модель, основанная на Transformer, поэтому она имеет словарь типа WordPiece.

tr_core_web_lg и tr_core_web_md упакованы со статическими векторами, очевидно, нам нужны были типы векторов, поддерживающие морфемы турецкого языка. Тут на помощь приходят Цветочки-векторы. Floret — это расширенная версия fastText, которая использует вложения Блума для создания компактных векторных таблиц с информацией как о словах, так и о подсловах. Турецкие морфемы довольно часто используют представления подслов, поэтому вполне подходят для наших новых пакетов. Наш вектор Floret также можно отдельно загрузить из их репозиториев Hugging Face [1]. Прежде чем выбрать правильные параметры, мы поэкспериментировали с параметрами длины подслова.

Собираем все вместе и тренировочный процесс

Собрав все вместе, мы упаковали векторы Floret, загрузили модель Turkish Transformer из Hugging Face, подготовили набор данных NER и банк деревьев. Наконец, все, что нам нужно было сделать, это написать эти простые строки yaml, чтобы начать обучение:

workflows:
  all:
    - preprocess_ud
    - train_tagger
    - evaluate_tagger
    - preprocess_ner
    - train_ner
    - evaluate_ner
    - assemble
    - package

Все скрипты можно найти в репозитории spaCy Turkish Github.

Обучение проходило в Google Cloud. Благодаря щедрой поддержке программы GDE 😊. Все модели обучались на экземпляре типа c2-standard-16. Если вы хотите тренироваться вместе, вы можете посмотреть мой видеоурок Как тренировать модели spaCy здесь. Обратите внимание, что мой экземпляр называется duygu1 😄 😄 (есть и duygu2, это виртуальная машина TPU).

Уважаемые читатели, это был наш взгляд на новые модели spaCy Turkish. Эта работа является частью моей кампании осень-зима 2023 года «Турецкое НЛП с Дуйгу» и щедро поддержана программой Google Developer Experts.

Если вы хотите узнать больше о турецком НЛП, вы можете посетить веб-страницу моей кампании или, что еще лучше, мой канал на Youtube НЛП с Дуйгу. Всегда приятно встретиться с вами на турецком НЛП, чтобы узнать больше, пожалуйста, следите за обновлениями и будьте счастливы тем временем 🎉🎉🎉

Рекомендации

  1. Турецкий НЛП-люкс Обнимающее лицо: https://huggingface.co/turkish-nlp-suite
  2. Турецкий NLP Suite Github: https://github.com/turkish-nlp-suite
  3. Плейлист Все о турецкой лингвистике: https://www.youtube.com/watch?v=ZiArCDOuNVo&list=PLJTHlIwB8Vcqltlhbmsc12Srthv73OeOF
  4. Турецкий Wiki NER Dataset
    Github: https://github.com/turkish-nlp-suite/Turkish-Wiki-NER-Dataset
    Huggingface: https://huggingface.co/datasets/ турецкий-nlp-suite/турецкий-wikiNER
  5. Турецкий банк деревьев BOUN: https://github.com/UniversalDependencies/UD_Turkish-BOUN