НЛП для индийских языков

Известно, что около 10% населения Индии говорит по-английски [1], а остальные 90% говорят на таких языках, как хинди, маратхи, гуджарати, пенджаби и т. д. Таким образом, многоязычное общество в Индии не сможет в полной мере использовать преимущества искусственного интеллекта без современных систем НЛП для региональных языков.

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

Вложения слов

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

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

быстрый текст [3]

fastText — это библиотека для предварительно обученного встраивания слов и классификации текста, созданная искусственным интеллектом Facebook. Модели были обучены со словами, представленными в виде набора n-грамм символов, а n-граммы символов имеют связанные с ними векторы. Затем слова представляются суммой этих векторных представлений [4]. Предварительно обученные векторы слов fastText доступны для 294 языков, обученных на данных Wiki, и их можно скачать здесь. Ниже приведен фрагмент кода, который показывает загрузку встраивания слов fastText для хинди.

import fasttext
import fasttext.util
ft = fasttext.load_model('wiki.hi.bin')
word = "नृत्य"
print("Embedding Shape is {}".format(ft.get_word_vector(word).shape))
print("Nearest Neighbors to {} are:".format(word))
ft.get_nearest_neighbors(word) 

Форма встраивания (300,)

Ближайшие соседи к नृत्य:

[(0.8913929462432861, 'नृत्य।'),
(0.8440190553665161, 'नृत्यगान'),
(0.8374733924865723, 'नृत्यगीत'),
(0.8336297869682312, 'नृत्यों'),
(0.8265783190727234, 'नृत्यरत'),
(0.7971948385238647, 'नृत्यकला'),
(0.7879464626312256, 'नृत्त'),
(0.7682990431785583, 'नृतक'),
(0.7622954845428467, 'नृत्यरचना'),
(0.7602956295013428, 'नृत्यग्राम')]

Слово «नृत्य» означает «танец» на английском языке, и ближайшие к нему слова в пространстве вложения кажутся похожими по смыслу (например, नृत्यगीत означает «танцевальная песня»). FastText поддерживает большинство индийских языков, таких как хинди, маратхи, тамильский, телугу.

иНЛТК [5]

iNLTK — это библиотека с открытым исходным кодом, состоящая из различных ресурсов, таких как предварительно обученные языковые модели, встраивания слов, встраивания предложений и еще несколько для 13 индийских языков [6]. Вложения слов получаются из слоя встраивания предварительно обученной языковой модели. Ниже фрагмент кода показывает, как загрузить вложения:

from inltk.inltk import setup
setup('hi') #### Needed only once
from inltk.inltk import get_embedding_vectors
word = "नृत्य"
vectors = get_embedding_vectors(word, 'hi')
print("Embedding Shape is {}".format(vectors.shape))

from inltk.inltk import get_sentence_encoding
text ="मैं भाग रहा हूँ"
encoding = get_sentence_encoding(text, 'hi')
print("Sentence Embedding Shape is {}".format(encoding.shape))

Форма встраивания (400,)

Форма встраивания предложения (400,)

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

ИндикФТ [7]

Это модели fastText, обученные на корпусе IndicNLP [8] и доступные для 11 индийских языков. Вам нужно будет загрузить бинарные файлы модели отсюда и легко использовать их с библиотекой fastText.

import fasttext
import fasttext.util
ft = fasttext.load_model('indicnlp.ft.hi.300.bin')
word = "नृत्य"
print("Embedding Shape is {}".format(ft.get_word_vector(word).shape))
print("Nearest Neighbors to {} are:".format(word))
ft.get_nearest_neighbors(word)

Embedded Shape (300,)
Ближайшие соседи к नृत्य:

[(0.8393551111221313, 'नृत्यों'),
(0.8289133906364441, 'लोकनृत्य'),
(0.7881444096565247, 'लोकनृत्यों'),
(0.7832040786743164, 'लोकनृत्य,'),
(0.7764051556587219, 'नृत्य,'),
(0.7572897672653198, 'नृत्य।'),
(0.7543818354606628, 'नृत्य’'),
(0.7490015625953674, 'नृत्यांगनाओं'),
(0.7466280460357666, 'कत्थक'),
(0.7412323355674744, 'गायन')]

Если мы сравним ближайших соседей, полученных с помощью этой техники, с FastText по умолчанию, то здесь на выходе будут различные другие слова, которые не содержат строку «नृत्य», но связаны с ней, поэтому кажется, что между словами существуют отношения, отличные от значения. лучше фиксируется в моделях IndicFT. Подробнее об обучении см. в [6].

Муриль [9]

MuRIL — это предварительно обученная языковая модель на основе BERT, выпущенная Google и обученная на 17 индийских языках [10]. Стратегия обучения аналогична стратегии многоязычного BERT с небольшими изменениями. Модель можно легко скачать отсюда и загрузить в несколько строк с библиотекой HuggingFace.

path = 'google/muril-base-cased'
## Loading the model
from transformers import AutoModel, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained(path)
model = AutoModel.from_pretrained(path,output_hidden_states=True)
## Embeddings 
text ="कोई अच्छी सी फिल्म लगायो"
print(tokenizer.convert_ids_to_tokens(tokenizer.encode(text)))
input_encoded = tokenizer.encode_plus(text, return_tensors="pt")
with torch.no_grad():
         states = model(**input_encoded).hidden_states
output = torch.stack([states[i] for i in range(len(states))])
output = output.squeeze()
print("Output shape is {}".format(output.shape))

['[CLS]', 'कोई', 'अच्छी', 'सी', 'फिल्म', 'लगा', '##यो', '[SEP]']
Выходная форма — torch.Size( [13, 8, 768])

Первое измерение вывода представляет собой количество слоев (12 слоев + слой внедрения), второе представляет количество токенов, а третье — скрытый размер. Встраивание предложений можно извлечь путем усреднения по слоям и токенам (обычно рассматриваются последние четыре слоя, но можно взять и среднее значение по всем слоям). Контекстные вложения слов могут быть извлечены суммой по соответствующим выходным токенам (поскольку входные токены здесь являются единицами подслов, а не словами) со средним значением по слоям.

ИндикБЕРТ [11]

IndicBERT выпущен AI4Bharat в составе IndicNLPSuite [8]. IndicBERT — это многоязычная модель на основе ALBERT, предварительно обученная 12 основным индийским языкам. Модель легко скачать отсюда и загрузить в несколько строк с библиотекой HuggingFace аналогично тому, как это делается для модели MuRIL. Вложения предложений и слов также можно извлечь с помощью приведенного выше кода, просто изменив переменную path с 'google/muril-base-cased' на 'ai4bharat/indic-bert. '.

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

  1. https://en.wikipedia.org/wiki/Многоязычие_в_Индии
  2. https://en.wikipedia.org/wiki/Word_embedding
  3. https://fasttext.cc/docs/en/crawl-vectors.html
  4. Наполнение векторов слов информацией о подсловах
  5. https://inltk.readthedocs.io/en/latest/index.html
  6. iNLTK: Инструментарий естественного языка для индийских языков
  7. https://indicnlp.ai4bharat.org/indicft/
  8. https://indicnlp.ai4bharat.org/home/
  9. https://huggingface.co/google/muril-base-cased
  10. MuRIL: многоязычные представления индийских языков
  11. https://indicnlp.ai4bharat.org/indic-bert/