Уводзіны ў Bag of Words і як запраграмаваць яго ў Python для NLP

Белыя і чорныя кафлі для скраба на чорнай паверхні ад Pixabay

Bag of Words (BOW) - гэта спосаб здабывання функцый з тэкставых дакументаў. Гэтыя функцыі можна выкарыстоўваць для навучання алгарытмам машыннага навучання. Ствараецца слоўнікавы запас усіх унікальных слоў, якія з'яўляюцца ва ўсіх дакументах навучальнага набору.

Кажучы простымі словамі, гэта сукупнасць слоў, якія прадстаўляюць сказы з шэрагам слоў і звычайна ігнаруюць парадак, у якім яны з'яўляюцца.

BOW - гэта шырока выкарыстаны падыход для:

  1. Натуральная апрацоўка мовы
  2. Атрыманне інфармацыі з дакументаў
  3. Класіфікацыя дакументаў

На высокім узроўні гэта ўключае наступныя этапы.

Ствараныя вектары можна ўвесці ў алгарытм машыннага навучання.

Пачнем з прыкладу разумення, прымаючы некалькі прапаноў і ствараючы для іх вектары.

Разгледзім наступныя два сказы.

1. "Джон любіць глядзець фільмы. Мэры таксама падабаецца фільмы".
2. "Джон таксама любіць глядзець футбольныя гульні".

Гэтыя два сказы таксама могуць быць прадстаўлены зборнікам слоў.

1. ["Іаан", "падабаецца", "глядзі", "фільмы"., "Мэры", "сімпатыі", "фільмы", "таксама".]
2. ["Джон", "таксама", "падабаецца", "да", "глядзець", "футбол", "гульні"]

Таксама выдаліце ​​некалькі слоў для кожнага сказа і выкарыстоўвайце для падліку гэтага слова.

1. {"Джон": 1, "лайкі": 2, "да": 1, "глядзець": 1, "фільмы": 2, "Марыя": 1, "таксама": 1}
2. {"Джон": 1, "таксама": 1, "лайкі": 1, "да": 1, "глядзець": 1, "футбол": 1, "гульні": 1}

Калі выказаць здагадку, што гэтыя прапановы з'яўляюцца часткай дакумента, агульная частата слоў для ўсяго нашага дакумента прыведзена ніжэй. Абодва прапановы ўлічваюцца.

{"Джон": 2, "лайкі": 3, "да": 2, "глядзець": 2, "фільмы": 2, "Марыя": 1, "таксама": 1, "таксама": 1, " Футбол ": 1," Гульні ": 1}

Вышэйапісаная лексіка ўсіх слоў у дакуменце з адпаведнай колькасцю слоў выкарыстоўваецца для стварэння вектараў для кожнага з прапаноў.

Даўжыня вектара заўсёды адпавядае памеру лексікі. У гэтым выпадку даўжыня вектара складае 11.

Каб прадставіць нашы арыгінальныя прапановы ў вектары, кожны вектар ініцыялізуецца з усімі нулямі - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Затым варта ітэрацыя і параўнанне з кожным словам у нашым слоўніку і павелічэнне вектарнай велічыні, калі прапанова змяшчае гэтае слова.

Джон любіць глядзець фільмы. Мэры таксама любіць фільмы. [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
Джон таксама любіць футбольныя гульні. [1, 1, 1, 1, 0, 0, 0, 1, 1, 1]

Прыклад: у сказе 1 слова "сімпатыі" знаходзіцца на другім месцы і з'яўляецца два разы. Такім чынам, другі элемент нашага вектара для сказа 1 будзе 2: [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]

Вектар заўсёды прапарцыйны велічыні нашага слоўніка.

Вялікі дакумент, у якім сфармаваны слоўнікавы запас вельмі вялікі, можа прывесці да вектара з многімі значэннямі 0. Гэта называецца разрэджаным вектарам. Рэдкія вектары патрабуюць больш памяці і вылічальных рэсурсаў пры мадэляванні. Вялікая колькасць пазіцый або памераў можа зрабіць працэс мадэлявання вельмі складаным для звычайных алгарытмаў.

Кадаванне нашага алгарытму BOW

Уваход у наш код складаецца з некалькіх прапаноў і выхад з вектараў.

Уваходны масіў выглядае наступным чынам:

["Джо чакае цягніка", "Цягнік спазніўся", "Мэры і Саманта селі ў аўтобус"
"Я шукаў Марыю і Саманту на аўтавакзале",
"Мэры і Саманта прыехалі рана на аўтавакзал, але чакалі аўтобуса да поўдня"]

Крок 1: азначэнне сказа

Спачатку выдаляем прыпыначныя словы з прапаноў.

Стоп-словы - словы, значэнне якіх недастаткова, каб выкарыстоўваць іх без нашага алгарытму. Мы не хочам, каб гэтыя словы займалі месца ў нашай базе дадзеных і не займалі каштоўны час апрацоўкі. Па гэтай прычыне мы можам лёгка выдаліць іх, захоўваючы спіс слоў, якія вы лічыце стоп-словамі.

Токенізацыя - гэта разбор паслядоўнасці радкоў на такія часткі, як словы, ключавыя словы, фразы, сімвалы і іншыя элементы, якія называюцца лексемамі. Лексемы могуць быць асобнымі словамі, фразамі або цэлымі прапановамі. Некаторыя сімвалы, такія як знакі прыпынку, адкідваюцца падчас токенізацыі.

def word_extraction (прапанову): ignore = ['a', "the", "is"] words = re ("[^ \ w]", "", прапанову) .split () washing_text = [w.lower () для w словамі, калі w не ігнаруецца] Вяртае вычышчаны тэкст

Вы можаце выкарыстоўваць бібліятэку python nltk для больш надзейнай рэалізацыі стоп-слоў. Ёсць некалькі загадзя зададзеных слоў у кожнай мове. Вось прыклад:

Імпартаваць nltk імпартаваць стоп-словы з набору nltk.corpus (stopwords.words ('англійская'))

Крок 2: Прымяніце токенізацыю да ўсіх мностваў

def tokenize (прапановы): словы = [] для сказа ў сказах: w = вытрымка (сказ) словы.extend (w) словы = сартаваныя (спіс (набор (словы))) зваротныя словы

Метад паўтарае ўсе прапановы і ўстаўляе вынятае слова ў масіў.

Выхад гэтага метаду:

["і", "прыйшоў", "да", "аўтобус", "але", "рана", "за", "я", "джо", "позна", "паглядзеў", "мэры", " Апоўдні "," Саманта "," Станцыя "," То "," Узяў "," Цягнік "," Да "," Чакалі "," Быў "]

Крок 3: стварыць слоўнікавы запас і генераваць вектары

Выкарыстоўвайце метады, вызначаныя на этапах 1 і 2, каб стварыць слоўнікавы запас дакумента і выняць словы з прапаноў.

def generator_bow (allsentences): vocab = tokenize (allsentences) print ("Спіс слоў для дакумента \ n {0} \ n" .format (vocab));
для сказа ва ўсіх прапановах: словы = вытрымка (сказ) bag_vector = numpy.zeros (len (vocab)) для w у словах: для i, слова ў пералічэнні (слоўніка): калі слова == w: bag_vector [i] + = 1 раздрукоўка ("{0} \ n {1} \ n" .фармат (запіс, numpy.array (bag_vector))

Вось пэўны ўвод і выкананне нашага кода:

allsentences = ["Джо чакаў цягнік", "Цягнік спазніўся", "Мэры і Саманта селі ў аўтобус",
"Я шукаў Марыю і Саманту на аўтавакзале",
"Мэры і Саманта прыехалі рана на аўтавакзал, але чакалі аўтобуса да поўдня"]
gene_bow (усеназванні)

Выхадныя вектары для кожнага з набораў:

Выданне:
Джо чакаў цягніка [0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 2. 2. 0. 1. 0.]
Цягнік спазніўся [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
Марыя і Саманта селі ў аўтобус [1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 0.]
Я шукаў Марыю і Саманту на аўтавакзале [1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]
Мэры і Саманта прыехалі рана на аўтавакзал, але чакалі аўтобуса да поўдня [1. 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 1. 1. 1. 0.]

Як бачыце, кожнае прапанову параўноўваюць са спісам нашых слоў, створаным на этапе 1. Зыходзячы з параўнання, вектарны элемент можна павялічыць. Гэтыя вектары могуць быць выкарыстаны ў алгарытмах ML для класіфікацыі дакументаў і прагназавання.

Мы напісалі наш код і стварылі вектары, але зараз мы хочам зразумець лексіку крыху лепш.

Уяўленне пра збор слоў

Мадэль BOW прымае пад увагу толькі тое, ці з'яўляецца ў дакуменце вядомае слова. Гаворка ідзе не пра сэнс, кантэкст і парадак, у якім яны з'яўляюцца.

Гэта дае разуменне таго, што ў падобных дакументах ёсць падлікі слоў, падобныя адзін да аднаго. Іншымі словамі, чым больш падобных слоў у двух дакументах, тым больш дакументаў могуць быць падобныя.

Абмежаванні BOW

  1. Семантычнае значэнне: Асноўны падыход BOW не ўлічвае значэнне слова ў дакуменце. Кантэкст, у якім ён выкарыстоўваецца, цалкам ігнаруецца. Тое ж слова можа выкарыстоўвацца ў некалькіх месцах, у залежнасці ад кантэксту і бліжэйшых слоў.
  2. Памер вектара: Для вялікага дакумента памер вектара можа быць вельмі вялікім, што патрабуе вялікай колькасці высілкаў і часу. Магчыма, вам трэба праігнараваць словы, якія адпавядаюць выпадку выкарыстання.

Гэта было невялікім увядзеннем у метад BOW. Код паказаў, як ён працуе на нізкім узроўні. Ёсць значна больш, каб зразумець пра BOW. Напрыклад, замест таго, каб падзяліць наш сказ на адно слова (1 грам), вы можаце падзяліць два словы (2 грама ці 2 грама). Часам прадстаўленне двух грам здаецца нашмат лепш, чым ад аднаго грама. Яны часта могуць быць прадстаўлены ў пазначэнні N-грам. Я правёў некаторыя даследаванні ў раздзеле рэсурсы, каб паглыбіць веды.

Вы не заўсёды павінны код "BOW", калі вам гэта трэба. Гэта ўжо частка многіх даступных рамак, такіх як CountVectorizer у Learn Sci-Kit.

Наш папярэдні код можна замяніць наступным:

імпартаваць CountVectorizer з sklearn.feature_extraction.text vectorizer = CountVectorizer () X = vectorizer.fit_transform (allsentences) друку (X.toarray ())

Заўсёды добра разумець, як працуюць бібліятэкі ў рамках і якія метады стаяць за імі. Чым лепш вы разумееце паняцці, тым лепш вы можаце выкарыстоўваць рамкі.

Дзякуй за прачытанне артыкула. Код, паказаны, даступны на маім GitHub.

Вы можаце сачыць за мной на Medium, Twitter і LinkedIn. Калі ў вас ёсць якія-небудзь пытанні, вы можаце звязацца са мной па электроннай пошце (praveend806 [at] gmail [dot] com).

Рэсурсы, каб прачытаць больш пра лексіку

  1. Вікіпедыя-БАУ
  2. Разуменне мадэлі мяшка слоў: статыстычная база
  3. Семантычныя мадэлі пакетаў і прыкладанняў