شناسایی زبان یک سند با استفاده از NLP!

شکل۱. شناسایی زبان یک سند با استفاده از NLP
شکل۱. شناسایی زبان یک سند با استفاده از NLP
منتشر شده در analyticsvidhya به تاریخ ۵ آگوست، ۲۰۲۱
لینک منبع: Identifying The Language of A Document Using NLP!

مقدمه

هدف این مقاله شناسایی زبان از متن نوشته شده‌است. متن در اسناد به زبان‌های بسیاری موجود است و زمانی که ما زبان را نمی‌دانیم، گاهی اوقات گفتن آن به مترجم گوگل نیز بسیار دشوار می‌شود. برای بیشتر مترجمان، ما باید هم زبان ورودی و هم زبان مورد نظر را بگوییم. اگر شما متنی به زبان اسپانیایی دارید و تنها انگلیسی یا هندی را بلد هستید، چگونه می‌توانید تشخیص دهید که متن داده‌شده به زبان اسپانیایی است؟ بنابراین هدف از این پروژه این است که به کاربران اجازه دهد تا شش زبان مختلف را با استفاده از NLP (پردازش زبان طبیعی) شناسایی کنند. در این مقاله، ما یک تجزیه و تحلیل مقایسه‌ای بین دو رویکرد مختلف در رابطه با دقت انجام می‌دهیم. این یکی از پروژه‌های مشهوری است که هر علاقمند به علم داده باید در رزومه خود بگنجاند.

مجموعه داده مورد استفاده برای این منظور، مجموعه داده پیدایش است. سفر پیدایش مجموعه داده مشهور کتابخانه NLTK است. ترکیبی از شش زبان فنلاندی، انگلیسی، آلمانی، فرانسوی، سوئدی و پرتغالی در این مجموعه داده گنجانده شده‌است.

from nltk.corpus import genesis as dataset

languages = ["finnish", "german", "portuguese","english", "french", "swedish"]

روش ۱: شناسایی زبان با استفاده از محبوب‌ترین char-n-grams

در [ ۱ ]، نویسندگان از محبوب‌ترین char-n-grams برای تشخیص زبان استفاده کرده‌اند.

فرضیه ۱:char-n-grams در زبان فراوانی بیشتری نسبت به دیگر char-n-grams دارند.

اعتبار سنجی فرضیه ۱: char-n-gram ایجاد شده (تنها سه‌تایی‌ها) تا ببینیم آیاZipf با char-n-gram دنبال می‌شود یا خیر.

#corpus_words was declared earlier in the notebook - contains words of the 6 languages being considered.

def n_grams(s, n=3):

""""Returns char-n-grams of a words

"""

s = "#"+ s + "#"

return [s[i:i+n] for i in range(len(s)-n+1)]

char_trigrams = {}

for lang in corpus_words.keys():

tri_grams = []

for word in corpus_words[lang]:

tri_grams = tri_grams + n_grams(word.lower())

dist = dict(FreqDist(tri_grams))

char_trigrams[lang] = (sorted(dist.values(),reverse=True))

data = []

for lang in char_trigrams.keys():

data.append(Scatter(

x = range(1, len(char_trigrams[lang])+1),

y = char_trigrams[lang],

name = lang))

iplot({ 'data' : data,

'layout': Layout(title = "Char-tri-gram Frequency Distribution")

})

فرضیه ۱ معتبر است. برخی از n-gramها (سه گرم) وجود دارند که نسبت به دیگر char-n-gramها فراوان‌تر هستند.

روش: داده‌ها را به بخش آموزش-آزمون تقسیم کنید (۸۰٪ -۲۰٪). از مجموعه تمرینات آموزشی، k پرتکرارترین char-n-gramها است. برای هر سند (کلمه-تریگرام) در مجموعه آزمون، char-tri-grams را استخراج کرده و زبانی را انتخاب کنید که بیش‌ترین همپوشانی با آن وجود دارد.

from random import shuffle

from sklearn.cross_validation import train_test_split

shuffle(tri_gram_dataset)

train_set, test_set = train_test_split(tri_gram_dataset, test_size = 0.20)

print len(train_set), len(test_set)

def get_char_ngram(trigram,k=3):

tri_grams = []

for word in trigram:

tri_grams = tri_grams + n_grams(word.lower())

return tri_grams

def top_k_ngrams_features(n=3, k=50):

"""Input: n of the char-n-grams;

k of top-k

Processes Word-Corpus{language: } defined above

Returns the top-k character-n-grams of each language in the form of

{language, }

"""

char_trigrams = {}

for i in train_set:

if i[0] in char_trigrams:

char_trigrams[i[0]] += get_char_ngram(i[1])

else:

char_trigrams[i[0]] = get_char_ngram(i[1])

for lang in char_trigrams.keys():

dist = dict(FreqDist(char_trigrams[lang]))

top_k_char_n_gram = (sorted(dist, dist.get, reverse=True))[:100]

char_trigrams[lang] = set(top_k_char_n_gram)

return char_trigrams

char_trigrams = top_k_ngrams_features()

def predict_language_char_ngrams(trigram):

language, max_score = None, -0.1

char_ngrams = get_char_ngram(trigram)

for lang in languages:

if lang == 'english':

lang = 'english-web'

score = float(len(char_trigrams[lang].intersection(char_ngrams)))/float(len(char_ngrams))

if score > max_score:

language = lang

max_score = score

return language

y_actual, y_pred = [], []

for i in test_set:

y_actual.append(i[0])

y_pred.append(predict_language_char_ngrams(i[1]))

print classification_report(y_actual, y_pred)

#Checking Scores for Stop-Words Approach only on TestSet

y_actual, y_pred = test_stopwords_approach(test_set)

print classification_report(y_actual, y_pred)

مشاهدات:

با این حال، افزایش مشخصی در دقت وجود دارد، یادآوری تنها ۰.۰۲. افزایش‌یافته است.

رویکرد ۲ (Character n-gram) اگر n-گرام بیشتر و داده بیشتری گرفته شود، ممکن است هنوز هم بهتر عمل کند.

رویکرد ۲: استفاده از نمایش جهانی با سطح کاراکترهای پراکنده

پس‌زمینه:

مدل Skip-Gram :

در [ ۲ ]، نویسندگان دو مدل شبکه عصبی را برای نمایش توزیعی کلمات پیشنهاد کردند-CBOW (مدل پیوسته Bag-of-Words) و Skip-Gram.

· برای مدلCBOW، این مدل ورودی «n» را قبل و بعد از کلمات می‌گیرد و کلمه میانی را پیش‌بینی می‌کند.

· برای مدلSkip-Gram، این مدل یک کلمه را وارد می‌کند و «n» را قبل و بعد از کلمات آن کلمه پیش‌بینی می‌کند.

در آخرین اثر به نام] Fasttext ۳، ۴[ ، مدل‌هایCBOW وskip-Gram به منظور ترکیب اطلاعات سطح کاراکتر برای درک بهتر متن توسعه‌یافته‌اند. سهم اصلی این کار، اصلاح بردار کلمه به عنوان مجموع بردار کاراکتر n-grams آن بود.

import fasttext

def create_train_file(doc_set,fname):

""" Creates a text file such that for each tri-gram:

where the label is the language. FastText takes a file as input for training.

Returns: The filename of the created file.

"""

train_file = open(fname,"w+")

for i in doc_set:

label = "__label__"+i[0]

text = " ".join(i[1])

train_file.write(label.encode('utf8')+ " " +text.encode('utf8')+"n")

train_file.close()

return fname

train_filename = create_train_file(train_set,"Train_File.txt")

model = fasttext.supervised(train_filename, 'model',min_count=1,epoch=10,ws=3,

label_prefix='__label__',dim=50)

#For sanity checks

print model.labels

def get_test_pred(test_set):

"""

Input: TestSet : Pairs

Ouput: List of

"""

y_actual, y_pred = [], []

for i in test_set:

y_actual.append(i[0])

pred = model.predict([" ".join(i[1])])[0][0]

y_pred.append(pred)

return [y_actual, y_pred]

y_actual, y_pred = get_test_pred(test_set)

print classification_report(y_actual, y_pred)

مشاهدات:

نتایج طبقه‌بندی مبتنی بر تعبیه کلمه بسیار تحت‌تاثیر داده‌های کوچک مانند توییت‌ها، چت‌ها و پیام‌های کوتاه قرار می‌گیرد.

نکته: دلیل استفاده نکردن از مدل‌های اصلی Skip-Gram و CBOW برای شناسایی زبان این است که محدودیت‌های اولین مدل‌ها برای رسیدگی به کلمات دیده نشده در مقالهFasttext نشان‌داده شده‌است.

نتیجه‌گیری:

۱. رویکرد توقف کلمه قوی است و به هیچ آموزشی نیاز ندارد، اما زمانی که شامل متون کوتاه باشد، شکست می‌خورد.

۲. رویکرد char-n-gram برخی از پیشرفت‌ها را در مجموعه داده‌های متن کوتاه نشان داد اما نتایج چشمگیر نبودند.

۳. دسته‌بندی کلمات براساس نمودار درختی می‌تواند متون کوتاه یک زبان خاص را با موفقیت شناسایی کند.

۴. از این رو، برای متون طولانی، رویکرد توقف کلمات ممکن است ساده‌ترین تناسب باشد به جز برای متون کوتاه، یک مدل از پیش آموزش‌دیده با پشتیبانی char-n-gram ممکن است برای نتایج بهتر استفاده شود.

این پروژه زبان متن را به راحتی شناسایی می‌کند و همچنین می‌توانید تحلیل مقایسه‌ای هر دو رویکرد را بررسی کنید. با استفاده از نمایش کلمات در سطح کاراکتر توزیع‌شده. هر دو رویکرد مزایا و معایب خاص خود را دارند. کسی را که برای شما مناسب‌تر است، انتخاب کنید.

این پروژه به شما کمک می‌کند دانش خود را در NLP افزایش دهید و باعث می‌شود رزومه‌تان برجسته شود.

این متن با استفاده از ربات مترجم مقاله هوش مصنوعی ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.