Sözlər çantasına bir giriş və onu NLP üçün Pythonda necə proqramlaşdırmaq olar

Pixabay'dan qara səthdəki ağ və qara rəngli plitələr

Sözlər çantası (BOW), mətn sənədlərindən xüsusiyyətləri çıxarmaq üsuludur. Bu funksiyalar maşın öyrənmə alqoritmlərini öyrətmək üçün istifadə edilə bilər. Təlim dəstinin bütün sənədlərində görünən bütün unikal sözlərin lüğəti yaradılmışdır.

Sadə sözlərlə, bir cümlə ilə bir sıra sözləri ifadə edən və ümumiyyətlə meydana çıxma qaydalarına məhəl qoymayan sözlər toplusudur.

BOW aşağıdakılar üçün geniş istifadə olunan bir yanaşmadır:

  1. Təbii dil işlənməsi
  2. Sənədlərdən məlumat almaq
  3. Sənəd təsnifatları

Yüksək səviyyədə buna aşağıdakı addımlar daxildir.

Yaradılmış vektorlar maşın öyrənmə alqoritminə daxil edilə bilər.

Bir neçə cümlə götürərək onlar üçün vektorlar yaratmaqla anlayış nümunəsindən başlayaq.

Aşağıdakı iki cümləni nəzərdən keçirək.

1. "Con filmlərə baxmağı sevir. Məryəm də filmləri sevir."
2. "Con futbol oyunlarını izləməyi də sevir."

Bu iki cümlə də sözlər toplusu ilə təmsil oluna bilər.

1. ["John", "bəyənir", "görmək", "filmlər"., "Məryəm", "bəyənir", "filmlər", "həmçinin".]
2. ['John', 'də', 'like', 'to', 'watch', 'football', 'games']

Hər cümlə üçün bir neçə dəfə meydana gələn hadisəni çıxarın və bu sözləri ifadə etmək üçün istifadə edin.

1. {"John": 1, "like": 2, "to": 1, "watch": 1, "movies": 2, "Mary": 1, "too": 1}
2. {"John": 1, "də": 1, "bəyənir": 1, "to": 1, "watch": 1, "futbol": 1, "games": 1}

Bu cümlələrin sənədin bir hissəsi olduğunu fərz etsək, bütün sənədimiz üçün birləşdirilmiş söz tezliyi aşağıda verilmişdir. Hər iki cümlə də nəzərə alınır.

{"John": 2, "bəyənir": 3, "to": 2, "seyr": 2, "filmlər": 2, "Məryəm": 1, "çox": 1, "də": 1, " Futbol ": 1," Oyunlar ": 1}

Müvafiq sayda bir sənəd olan bütün sözlərin yuxarıdakı lüğətləri cümlələrin hər biri üçün vektorlar yaratmaq üçün istifadə olunur.

Vektorun uzunluğu həmişə lüğət ölçüsünə uyğundur. Bu vəziyyətdə vektorun uzunluğu 11-dir.

Orijinal cümlələrimizi bir vektorda təmsil etmək üçün hər bir vektor bütün sıfırlar ilə işlənir - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Bunun ardından söz ehtiyatımızdakı hər sözlə iterasiya və müqayisə aparılır və cümlədə bu söz varsa vektor dəyərini artırır.

Con filmlərə baxmağı sevir. Məryəm də filmləri sevir. [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
Con futbol oyunlarını da sevir. [1, 1, 1, 1, 0, 0, 0, 1, 1, 1]

Misal: 1-ci cümlədə "bəyənir" sözü ikinci yerdədir və iki dəfə görünür. Beləliklə, 1-ci cümlə üçün vektorumuzun ikinci elementi 2 olacaq: [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]

Vektor həmişə söz ehtiyatımızın ölçüsü ilə mütənasibdir.

Yaradılmış lüğətin çox böyük olduğu böyük bir sənəd 0 dəyərinə malik bir vektorla nəticələnə bilər. Buna seyrək vektor deyilir. Seyrək vektorlar modelləşdirmə zamanı daha çox yaddaş və hesablama mənbəyi tələb edir. Vəziyyətlərin və ya ölçülərin çoxluğu modelləşdirmə prosesini adi alqoritmlər üçün çox çətinləşdirə bilər.

BOW alqoritmimizi kodlaşdırmaq

Kodumuza giriş bir neçə cümlədən və vektorların çıxışından ibarətdir.

Giriş massivi aşağıdakı kimidir:

["Joe qatar gözləyirdi", "Qatar gec idi", "Məryəm və Samantha avtobusa mindi,"
"Mərtəbə və Samanthanı avtovağzalda axtarırdım",
"Məryəm və Samantha avtovağzala erkən gəldilər, ancaq günortaya qədər avtobus gözlədilər"]

Addım 1: bir cümlə işarəsi

Əvvəlcə cümlələrdən stop sözləri çıxarırıq.

Durdurma sözlər, alqoritmimiz olmadan istifadə etmək üçün yetərli olmayan sözlərdir. Bu sözlərin verilənlər bazamızda yer tutmasını və ya qiymətli işləmə vaxtının alınmasını istəmirik. Bu səbəblə, dayandırma sözləri hesab etdiyiniz sözlərin siyahısını saxlayaraq onları asanlıqla çıxara bilərik.

Tokenizasiya sözlər, açar sözlər, ifadələr, simvollar və işarələr adlanan digər elementlər kimi hissələrin ardıcıllıqla parçalanmasıdır. Tokenlər tək sözlər, ifadələr və ya bütün cümlələr ola bilər. Tiniş işarələri kimi bəzi simvollar işarələnmə zamanı atılır.

def word_extraction (cümlə): ignore = ['a', "the", "is"] words = re ("[^ \ w]", "", cümlə) .split () yuyulmuş_text = [w.lower () üçün w ilə sözlərdə w nəzərə alınmırsa] Təmizlənmiş mətni qaytarır

Dayandırıcı sözlərin daha sağlam həyata keçirilməsi üçün python nltk kitabxanasından istifadə edə bilərsiniz. Hər dildə əvvəlcədən təyin edilmiş bir sıra sözlər var. Bir nümunə:

Nltk.corpus dəstindən nltk idxal stop sözləri idxal et (stopwords.words ('english'))

Addım 2: Bütün dəstlərə token tətbiq edin

def tokenize (cümlələr): sözlər = [] cümlələrdəki cümlələr üçün: w = çıxarış (cümlə) sözlər.extend (w) sözlər = çeşidlənmiş (siyahı (dəst (sözlər))) qaytar söz

Metod bütün cümlələr üzərində təkrarlanır və çıxarılan sözü bir sıra daxil edir.

Bu metodun nəticəsi:

['və', 'gəldi', 'to', 'avtobus', 'lakin', 'erkən', 'for', 'I', 'joe', 'gec', 'baxdı', 'mary', ' Günorta "," samantha "," stansiya "," the "," götürdü "," qatar "," qədər "," gözlədi "," oldu "]

Addım 3: lüğət yaradın və vektorlar yaradın

Sənəd lüğətini yaratmaq və cümlələrdən sözləri çıxarmaq üçün 1 və 2-ci addımlarda müəyyən edilmiş metodlardan istifadə edin.

def generate_bow (allsentences): vocab = tokenize (allsentences) çap ("Sənəd üçün söz siyahısı \ n {0} \ n" .format (vocab));
bütün cümlələrdəki cümlələr üçün: sözlər = çıxarış (cümlə) bag_vector = numpy.zeros (len (vocab)) w ilə sözləri üçün: for i, sayımdakı söz (lüğət): if word == w: bag_vector [i] + = 1 çap ("{0} \ n {1} \ n" .format (qeyd, numpy.array (bag_vector))

Budur kodumuzun müəyyən edilmiş giriş və icrası:

allsentences = ["Joe qatar gözləyirdi", "Qatar çox gec idi", "Məryəm və Samantha avtobusa mindi",
"Mərtəbə və Samanthanı avtovağzalda axtarırdım",
"Məryəm və Samantha avtovağzala erkən gəldilər, ancaq günortaya qədər avtobus gözlədilər"]
generate_bow (allsentences)

Dəstlərin hər biri üçün çıxış vektorları bunlardır:

Nəşr:
Joe qatar gözləyirdi [0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 2. 2. 0. 1. 0.]
Qatar gecikdi [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
Məryəm və Samantha avtobusu götürdülər [1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 0.]
Avtovağzalda Məryəm və Samantanı axtarırdım [1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]
Məryəm və Samantha avtovağzala erkən gəldilər, ancaq günortaya qədər avtobus gözlədilər [1. 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 1. 1. 1. 0.]

Gördüyünüz kimi, hər cümlə 1-ci addımda yaradılan sözlər siyahısı ilə müqayisə edildi. Müqayisə əsasında vektor elementinin dəyəri artırıla bilər. Bu vektorlar sənəd təsnifatı və proqnozlaşdırılması üçün ML alqoritmlərində istifadə edilə bilər.

Kodumuzu yazdıq və vektorlar yaratdıq, amma indi lüğətimizi biraz daha yaxşı başa düşmək istəyirik.

Söz toplusuna dair anlayışlar

BOW modeli yalnız bilinən bir sözün sənəddə görünüb-göstərilməməsini nəzərə alır. Göründüyü məna, kontekst və nizam haqqında deyil.

Buna bənzər sənədlərin bir-birinə bənzər söz sayımları olduğuna dair fikir verir. Başqa sözlə, iki sənəddəki sözlər nə qədər oxşar olsa, sənədlər də bir-birinə bənzəyə bilər.

BOW məhdudiyyətlər

  1. Semantik məna: Əsas BOW yanaşması sənəddəki sözün mənasını nəzərə almır. İstifadə olunan kontekst tamamilə nəzərə alınmır. Eyni söz bir çox yerdə, kontekstə və ya yaxın sözlərə əsaslanaraq istifadə edilə bilər.
  2. Vektor ölçüsü: Böyük bir sənəd üçün, vektor ölçüsü çox böyük ola bilər ki, bu da çox hesablama vaxtı və səy sərf edir. İstifadənizlə əlaqəli sözlərə məhəl qoymamağınız lazım ola bilər.

Bu, BOW metoduna bir az giriş idi. Kod aşağı səviyyədə necə işlədiyini göstərdi. BOW haqqında anlamaq üçün daha çox şey var. Məsələn, cümlələrimizi bir sözə (1 qram) ayırmaq əvəzinə iki söz (2 qram və ya 2 qram) bölmək olar. Bəzən iki qramın təsviri bir qramdan daha yaxşı görünür. Bunlar çox vaxt N-qram notation ilə ifadə edilə bilər. Bilikləri dərinləşdirmək üçün Resurslar bölməsində bəzi araşdırmalar aparmışam.

Həmişə ehtiyac duyduğunuzda BOW kodunu yazmağınız lazım deyil. Artıq məlumat əldə etmə dəstindəki CountVectorizer kimi bir çox mövcud çərçivələrin bir hissəsidir.

Əvvəlki kodumuzla əvəz edilə bilər:

sklearn.feature_extraction.text vektorizatorundan CountVectorizer-i idxal et

Kitabxanaların çərçivələrdə necə işlədiyini və arxasında hansı metodların olduğunu anlamaq həmişə yaxşıdır. Anlayışları nə qədər yaxşı başa düşsəniz, çərçivələrdən daha yaxşı istifadə edə bilərsiniz.

Yazını oxuduğunuz üçün təşəkkür edirəm. Göstərilən kod mənim GitHub-da mövcuddur.

Məni Orta, Twitter və LinkedIn-də izləyə bilərsiniz. Hər hansı bir sualınız varsa, mənə e-poçt (praveend806 [at] gmail [dot] com) ilə müraciət edə bilərsiniz.

Söz lüğəti haqqında daha çox məlumat üçün mənbələr

  1. Vikipediya-BOW
  2. Çanta sözləri modelini başa düşmək: statistik bir çərçivə
  3. Semantik wordbag modelləri və tətbiqləri