NLP untuk Bahasa India

Diketahui bahwa sekitar 10% penduduk India berbicara bahasa Inggris [1], dan 90% sisanya berbicara bahasa seperti Hindi, Marathi, Gujarati, Punjabi, dll. Jadi, masyarakat multibahasa di India tidak akan dapat sepenuhnya memanfaatkan manfaatnya. AI tanpa sistem NLP canggih untuk bahasa daerah.

Pada artikel ini, saya akan membahas berbagai sumber Word Embeddings yang khusus dibuat untuk bahasa India. Sebelum itu, mari kita lihat apa sebenarnya kata embedding dan beberapa penerapannya.

Penyematan Kata

Penyematan kata adalah istilah yang digunakan untuk representasi kata untuk analisis teks, biasanya dalam bentuk vektor bernilai nyata yang mengkodekan arti kata sedemikian rupa sehingga kata-kata yang lebih dekat dalam ruang vektor diharapkan memiliki kesamaan makna [2].

Saat ini sudah umum untuk menggunakan penyematan kata yang telah dilatih sebelumnya seperti word2vec, gloVe dalam memecahkan beberapa masalah NLP daripada melatih penyematan dari awal. Sekarang mari kita bahas opsi apa saja yang memungkinkan jika seseorang mencari penyematan untuk bahasa India.

teks cepat [3]

fastText adalah perpustakaan untuk penyematan kata terlatih dan klasifikasi teks yang dibuat oleh AI Facebook. Model dilatih dengan kata-kata yang direpresentasikan sebagai kantong karakter n-gram dan karakter n-gram memiliki vektor yang terkait dengannya. Kata-kata tersebut kemudian direpresentasikan dengan jumlah dari representasi vektor tersebut [4]. vektor kata terlatih fastText tersedia untuk 294 bahasa yang dilatih berdasarkan data Wiki dan dapat diunduh dari di sini. Di bawah ini adalah cuplikan kode yang menunjukkan pemuatan penyematan kata fastText untuk bahasa Hindi.

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) 

Bentuk Penyematan adalah (300,)

Tetangga Terdekat dengan नृत्य adalah:

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

Kata “नृत्य” berarti menari dalam bahasa Inggris, dan kata-kata yang paling dekat dengannya di ruang penyematan tampaknya memiliki arti yang serupa (seperti नृत्यगीत berarti lagu dansa). Sebagian besar bahasa India seperti Hindi, Marathi, Tamil, Telugu didukung oleh fastText.

iNLTK [5]

iNLTK adalah perpustakaan sumber terbuka yang terdiri dari berbagai sumber seperti model bahasa terlatih, penyematan kata, penyematan kalimat, dan beberapa lainnya untuk 13 bahasa India [6]. Kata embeddings diperoleh dari lapisan embedding model bahasa yang telah dilatih sebelumnya. Cuplikan kode di bawah ini menunjukkan cara memuat embeddings:

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))

Bentuk Penyematan adalah (400,)

Kalimat Bentuk Penyematan adalah (400,)

Penyematan kalimat diperoleh dari keluaran encoder model bahasa terlatih dan dapat dimuat dengan cara serupa. Karena penyematan diperoleh dari keluaran pembuat enkode, hal ini bersifat kontekstual. Untuk lebih jelasnya, Anda dapat merujuk ke tautan ini.

IndeksFT [7]

Ini adalah model fastText yang dilatih pada korpus IndicNLP [8] dan tersedia untuk 11 bahasa India. Anda perlu mengunduh binari model dari di sini dan menggunakannya dengan mudah dengan perpustakaan 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)

Bentuk Penyematan adalah (300,)
Tetangga Terdekat dengan नृत्य adalah:

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

Jika kita membandingkan tetangga terdekat yang diperoleh dari teknik ini dengan fastText default, maka di sini berbagai kata lain yang tidak mengandung string “नृत्य” tetapi terkait dengannya muncul sebagai keluaran, jadi sepertinya ada hubungan selain makna di antara kata-kata tersebut. lebih baik ditangkap dalam model IndicFT. Untuk rincian pelatihan lebih lanjut silakan merujuk ke [6].

MuRIL [9]

MuRIL adalah model bahasa berbasis BERT terlatih yang dirilis oleh Google dan dilatih dalam 17 bahasa India [10]. Strategi pelatihannya mirip dengan BERT multibahasa dengan sedikit modifikasi. Modelnya dapat dengan mudah diunduh dari di sini dan dapat dimuat dalam beberapa baris dengan perpustakaan 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]']
Bentuk keluaran adalah obor.Ukuran( [13, 8, 768])

Dimensi keluaran pertama mewakili jumlah lapisan (12 lapisan + lapisan penyematan), dimensi kedua mewakili jumlah token, dan dimensi ketiga adalah ukuran tersembunyi. Penyematan kalimat dapat diekstraksi dengan membuat rata-rata pada lapisan dan token ( biasanya empat lapisan terakhir dipertimbangkan, tetapi kita juga dapat mengambil rata-rata untuk semua lapisan). Penyematan kata kontekstual dapat diekstraksi dengan menjumlahkan keluaran token yang sesuai (karena token masukan di sini adalah unit sub-kata dan bukan kata-kata) dengan rata-rata pada lapisan.

IndikatorBERT [11]

IndicBERT dirilis oleh AI4Bharat di bawah IndicNLPSuite [8]. IndicBERT adalah model berbasis ALBERT multi-bahasa yang telah dilatih sebelumnya dalam 12 bahasa utama India. Model dapat dengan mudah diunduh dari di sini dan dapat dimuat dalam beberapa baris dengan pustaka HuggingFace dengan cara yang sama seperti yang dilakukan untuk model MuRIL. Penyematan kalimat dan kata juga dapat diekstraksi menggunakan kode di atas hanya dengan mengubah variabel path dari 'google/muril-base-cased' menjadi 'ai4bharat/indic-bert '.

Referensi

  1. https://en.wikipedia.org/wiki/Multilingualism_in_India
  2. https://en.wikipedia.org/wiki/Word_embedding
  3. https://fasttext.cc/docs/en/crawl-vectors.html
  4. Memperkaya Vektor Kata dengan Informasi Subkata
  5. https://inltk.readthedocs.io/en/latest/index.html
  6. iNLTK: Perangkat Bahasa Alami untuk Bahasa India
  7. https://indicnlp.ai4bharat.org/indicft/
  8. https://indicnlp.ai4bharat.org/home/
  9. https://huggingface.co/google/muril-base-cased
  10. MuRIL: Representasi Multibahasa untuk Bahasa India
  11. https://indicnlp.ai4bharat.org/indic-bert/