НЛП для индийских языков
Известно, что около 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. '.
Рекомендации
- https://en.wikipedia.org/wiki/Многоязычие_в_Индии
- https://en.wikipedia.org/wiki/Word_embedding
- https://fasttext.cc/docs/en/crawl-vectors.html
- Наполнение векторов слов информацией о подсловах
- https://inltk.readthedocs.io/en/latest/index.html
- iNLTK: Инструментарий естественного языка для индийских языков
- https://indicnlp.ai4bharat.org/indicft/
- https://indicnlp.ai4bharat.org/home/
- https://huggingface.co/google/muril-base-cased
- MuRIL: многоязычные представления индийских языков
- https://indicnlp.ai4bharat.org/indic-bert/