Skip to content

domotova/Pos-tagging-sakha

Repository files navigation

Pos-tagging-sakha

В данной работе рассмотрена задача морфологического анализа - частеречная разметка якутских текстов. Под этим понимается этап автоматического определения частей речи слов в тексте.

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


Части речи якутского языка. Особенности разметки

Разметка ведется в формате CoNLL-U (URL: https://universaldependencies.org/format.html). Каждому слову задается метка части речи. В данной работе метками являются следующие:

  • NOUN - аат тыл (существительное)
  • ADJ - даҕааһын аат (имя прилагательное)
  • NUM - ахсаан аат (имя числительное)
  • PRON - солбуйар аат (местоимение)
  • VERB - туохтуур (глагол)
  • ADV - сыһыат (наречие)
  • PR - дьөһүөл (?)
  • CONJ - ситим тыл (союз)
  • PART - эбиискэ (частица)
  • AUX - сыһыан тыл (?)
  • INTJ - саҥа аллайыы (междометие)
  • PUNCT - пунктуация
  • SYM - символлар
  • X - атын (другое)

Датасет.

На данный момент собран корпус, состоящий из 2380 предложений, вручную размеченных по частям речи. Большую благодарность выражаю студентам ИЯКН СВФУ. Корпус находится в папке data с названием postag_sakha.conllu. Код создания корпуса в папке colab_notebooks - To_conllu.ipynb.

Данные для разметки взяты из репозитория sakha-embeddings (URL: https://github.com/nlp-sakha/sakha-embeddings). Перед разметкой данные были очищены от всех ненужных символов, приведены к единому кодированию символов. Код есть в папке colab_notebooks - _data_clean.ipynb.


Модели машинного обучения.

Здесь представлены две модели машинного обучения:

  • первый основан на сверточной нейронной сети, построенную по идеям статьи
Yu X., Faleńska A., Vu N. T. A general-purpose tagger with convolutional neural networks //arXiv preprint arXiv:1706.01723. – 2017
  • второй - на рекуррентных нейронных сетях. Выбрана модель Bidirectional LSTM + Wor2vec вложения слов.

Обучение моделей.

Требования:

  • Python
  • PyTorch
  • Keras

Дополнительные требования можно установить через:

pip install -r requirements.txt

Для обучения моделей:

  • Модель CNN
  1. Обучаем:
python train_cnn_postag_sakha.py

Обученная модель сохраняется в папке models - cnn_pos.

  1. Чтобы тестировать обученную модель:
# Загружаем нужные библиотеки
from utils import char_vocab, UNIQUE_TAGS, tokenize_corpus, POSTagger
import torch

# Загружаем обученную модель
cnn_pos_tagger = POSTagger(torch.load('./models/cnn_pos', map_location={'cuda:0': 'cpu'}), char_vocab, UNIQUE_TAGS, 75, 25)

# Вводим любые предложения, на которых хотим тестить
test_sentences = ['Саха сирин хайыһарга сүүмэрдэммит хамаандата билигин Новосибирскай куоракка үөрэнэр дьарыкка сылдьар .',
                  'М . К . Аммосов аатынан ХИФУ автодорожнай факультетын бастакы кууруһугар үөрэнэбин .']
test_sentences_tokenized = tokenize_corpus(test_sentences, min_token_size=1)

# Печатаем полученные метки слов
for sent_tokens, sent_tags in zip(test_sentences_tokenized, cnn_pos_tagger(test_sentences)):
    print(' '.join('{}-{}'.format(tok, tag) for tok, tag in zip(sent_tokens, sent_tags)))
    print()
  • Модель BiLSTM + Word2vec
  1. Сначала скачиваем уже обученные вложения слов Word2vec по ссылке - https://drive.google.com/drive/folders/1NdUxEZU_w_3ORBfxln-ujb1-7mT_8DRy?usp=sharing. Скачиваем два файла: word2vec_sakha, word2vec_sakha.vectors.npy в папку word2vec.
  2. Потом в папку data создаем файл с названием test.txt, где будут записаны предложения, которые потом будем тестить. Код следующий:
with open("./data/test.txt", "w") as f:
    for s in test_sentences: # test_sentences - это питоновский список, состоящий из предложений.
        f.write(s +"\n")
  1. Обучаем:
python train_rnn_postag_sakha.py

Обученная модель сохраняется в папке models - rnn_pos.

  1. Чтобы тестировать обученную модель:
# Загружаем нужные библиотеки
import keras
import numpy as np
from utils import TAGS, rnn_pred

# Загружаем обученную модель
rnn_model = keras.models.load_model("./models/rnn_pos")

# Загружаем преобразованные предложения, которые будем тестить
test = np.load('test_sents.npy')

# Печатаем полученные метки слов
pred = rnn_pred(rnn_model.predict_classes(test))
for i, k in zip(test_sentences, pred):
    print(' '.join('{}-{}'.format(tok, tag) for tok, tag in zip(i.split(), k.split())))
    print()

Выводы.

  • сформирован корпус из 2380 предложений с частеречной разметкой, который опубликован тут в папке data.
  • в тестовом наборе данных получены точности 81% и 80% при классификации членов предложения по частям речи сверточными и рекуррентными нейросетями соответственно. Это позволяет использовать разработанные нейросети для первичной обработки данных для последующего ручного исправления.
  • в ходе исследования были замечены уникальные аффиксы, такие как -ааччы и др., присущие только глаголам или иным частям речи. Это позволяет в дальнейшем организовать правила выявления частей речи.

В дальнейшем будем улучшать точность!


About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published