Բնական լեզվի մշակման հիմունքներ
Բնական լեզվի մշակումը (NLP) AI-ի (արհեստական բանականություն) ամենահայտնի մասն է: Այն զբաղվում է ծրագրավորման համակարգիչների ըմբռնմամբ՝ մեծ քանակությամբ մարդկային լեզվի մշակման և վերլուծության համար: Նպատակն է ստեղծել համակարգիչ, որը կարող է հասկանալ փաստաթղթերի բովանդակությունը և լսողական հնչյունները, ներառյալ դրանցում առկա լեզվի համատեքստային նրբությունները:
NLP-ի օգտագործման դեպքերը ներառում են.
- Առաջարկությունների համակարգեր և որոնման համակարգեր
- Լեզուների թարգմանություն
- Խոսքի ճանաչում
- Աշխատանքի ընդունում և հավաքագրում
- Chatbots
- Սենտիմենտալ վերլուծություն
Կան շատ ավելի շատ վայրեր, որոնք օգտագործվում են NLP-ն օգտատիրոջ կյանքը բարելավելու համար, ինչպիսիք են էլեկտրոնային առևտուրը, տեսանյութերի համար ենթագրեր ավելացնելը և այլն:
Ինչու է NLP-ն այդքան կարևոր:
Պատկերացրեք, որ արհեստական ինտելեկտը նման է փոքրիկ երեխայի, որտեղ այն պարունակում է արհեստական նեյրոնային ցանց՝ նեյրոններով ուղեղի փոխարեն: Երեխայի համար առաջին ուսումնական գործողություններից մեկը աշխարհը և նրա շուրջ խոսվող և գրված լեզուն հասկանալն է: Դա անելու համար երեխան օգտագործում է մարդկանց ասած խոսքերը և այն համատեքստը, որտեղ նրանք ասվել են, որպեսզի հասկանա, թե ինչ նկատի ունեն: Այսուհետ, նրանց առջև ասված յուրաքանչյուր նախադասության համար նրանց ուղեղը վերլուծում է.
- Բառերը բաժանված են ավելի փոքր հնչյունաբանության
- Այնկարգը, որով խոսվում էր հնչյունաբանությունը
- Վիզուալ ներկայացում այն գործողությունների, որոնք կատարվել են արտասանվող բառերից հետո և/կամ առաջ: Օրինակ. «Ձեռքդ կրակի մեջ մի՛ դրիր», և ինչ-որ մեկն իր ձեռքը կանգնեցնում է կրակի վառարանը դնելուց կամ «ինձից ջուր բեր», և ինչ-որ մեկը մի բաժակ ջուր է ստանում և այլն:
- Բառերի երանգը
- Այս խոսքերն ասող անձի մարմնի լեզուն
Երեխան կօգտագործի այս ամբողջ տեղեկատվությունը և տարիներ շարունակ կսովորեցնի իրեն, որպեսզի սկսի խոսել որոշ բառեր: Դրանից հետո որոշ բառեր կասվեն ճիշտ, իսկ մյուսները՝ սխալ: Այդ պահվածքն այնուհետև ուղղվի շրջապատի մեծահասակների կողմից (ծնողներ, հարազատներ, քույրեր և եղբայրներ և այլն): Դանդաղ, երեխան կսկսի սովորել որոշ բառեր ասելու ճիշտ ձևը, որը կամրապնդվի շրջապատի մարդկանց դրական արձագանքից:
Ի վերջո, երեխան գնում էր դպրոց՝ սովորելու լեզվի օրինաչափությունները, որպեսզի սկսեր ավելի բնականաբար խոսել բարդ բառեր և նախադասություններ: Տարիների վերապատրաստման և թեստերի շնորհիվ, որոնք թույլ են տալիս ինչպես բացասական, այնպես էլ դրական ամրապնդում, մարդը կարողանում է ճիշտ խոսել և գրել լեզուն:
Նույնիսկ այն ժամանակ նա կշարունակեր մարզվել՝ խոսելով և լսելով լեզուն շրջապատող մարդկանցից: Ավելին, խոսակցական լեզուն կարող է վերցվել հասակակիցներից ավելի ուշ կյանքում, և կամաց-կամաց մարդիկ կարող են սկսել շտկել այլ մարդկանց խոսքի փոքր սխալները (օրինակ՝ ի վիճակի լինել նույնականացնել խոսողին շրթունքներով):
Մեքենաները շատ ավելի արագ են օրինաչափությունների ճանաչում, քան մարդիկ, և կարող են սնվել միլիարդավոր չկառուցված տվյալների մշակման համար: Ներածումները, ինչպիսիք են բառերի հնչյունաբանությունը, հնչյունաբանության կարգը, տեսողական ներկայացումը, տոնայնությունը և մարմնի լեզուն, եթե սնվեն մեքենաների մեջ, կարող են կամաց-կամաց սովորեցնել նրանց կատարելապես հասկանալ մարդկային լեզուն: Այնուամենայնիվ, դա կպահանջի միլիարդավոր TB տվյալներ, որոնք կպահանջեն մեծ ջանքեր հավաքելու և կազմակերպելու համար, պահպանման համար մեծ ծախսեր և երկար ժամանակ մշակելու համար:
NLP ընկերությունների կողմից արված փոխզիջումներ
Դե, հիմա մենք գիտենք, թե ինչի դեմ ենք մրցակցում. երեխան սովորում է լեզու, որին սպասվում է տարիներ շարունակ մարզումներ և անսահման քանակությամբ տեսողական և լսողական տեղեկատվություն: Որոշ բազմամիլիարդատեր ռոբոտաշինական ընկերություններ դեռ փորձում են դիմակայել մարտահրավերին և նպատակ ունեն արտադրել արհեստական բանականություն ավելի լավ, քան մարդիկ: Թեև սա պահանջում է անվերջ ռեսուրսներ ծախսել միլիոնավոր PB նախնական տվյալների հավաքագրման և պահպանման վրա, ինչպես նաև խելացի ծրագիր՝ ինքնուսուցման համար դրական կամ բացասական ամրապնդման միջոցով:
Այնուամենայնիվ, ընկերությունների մեծամասնությանը բոլոր ազդանշանները պետք չեն: Ընկերությունների մեծամասնությունը համակարգչից պահանջում է միայն հասկանալ գրավոր բառապաշարը, ուստի հնչյունաբանությունը և հնչյունաբանության կարգը կարևոր են, սակայն տեսողական տվյալները, տոնայնությունը և մարմնի լեզուն անհետևանք ենմարզվելու համար: Սա խնայում է տվյալների հավաքագրման տոննա ժամանակը, հիշողության օգտագործումը և ուսուցման ժամանակը:
Այսուհետ, պատկերներից տեքստեր ստեղծելու առաջադրանքները համարվում են ավելի բարդ խնդիր համակարգիչների համար, քանի որ այն պահանջում է, որ համակարգիչը հասկանա բոլոր հինգ մուտքային ազդանշանները: Մյուս կողմից, Զգացմունքների վերլուծությունը պահանջում է վերը նշված հինգ ազդանշաններից երեքը: Մարմնի լեզունևտեսողական տվյալներ պարտադիր չէ:
Գրադարաններ
Ինչպես տեսանք, բնական լեզվի մշակումը պարզ խնդիր չէ: Այն ներառում է նեյրոնային ցանցերի ստեղծում, որոնք պետք է հասկանան այնպիսի օրինաչափություններ, որոնք նույնիսկ մարդու համար պահանջում են տարիներ խիստ ուսուցում: Հետևաբար, այս ծրագրերը մեծ նեյրոնային ցանցեր են, որոնք պատրաստված են մեծ տվյալների վրա:
NLTK
Այս գործընթացին աջակցելու համար կա գրադարան, որը դարձել է արդյունաբերության ստանդարտ՝ նեյրոնային ցանցի կառուցման բլոկները սահմանելու համար: Natural Language Toolkit (NLTK)-ը մարդկային լեզվի տվյալների հետ աշխատելու ծրագրեր ստեղծելու առաջատար հարթակն է: Այն ապահովում է նախապես սահմանված գործառույթներ դասակարգման, նշանավորման, բխող, հատկորոշման և վերլուծության համար: Դրանցից յուրաքանչյուրի մասին ավելի մանրամասն կխոսենք ապագայում։
Ուսումնասիրեք այն այստեղhttps://www.nltk.org/
NLP-ում օգտագործվող կարևոր պայմաններ
- Կորպուսը վերաբերում է փաստաթղթերի, տեքստային ֆայլերի, լսողական տվյալների և այլն հավաքագրմանը: Թվիթերից ստացված թվիթերի տվյալները կոչվում են կորպուսի տվյալներ, վիքիպեդիայի էջեր Google որոնման համար և այլն:
- Տեքստը բաժանվում է ավելի փոքր միավորների, որոնք կոչվում են Tokens: Յուրաքանչյուր նշան, ներառյալ բառի ընդմիջումները, տրվում է մի համար, և համակարգիչը կարող է հասկանալ նախադասության նշանն ու նշանների կարգը: Մեկ կամ մի քանի նշաններ ձևավորում են բառ, որպեսզի մեքենան կարողանա հասկանալ տարբեր բառեր՝ ելնելով նիշերի կարգից:
Tokenization
Tokenization-ը, ըստ էության, բառակապակցությունը, նախադասությունը, պարբերությունը կամ ամբողջ տեքստային փաստաթուղթը բաժանում է փոքր միավորների, օրինակ՝ առանձին բառերի կամ տերմինների: Այս փոքր միավորներից յուրաքանչյուրը կոչվում է tokens: Մի քանի գրադարաններ կարող են օգտագործվել խորհրդանշականացման համար, ինչպիսիք են NLTK, spaCY, տրանսֆորմատորներ և այլն…
Կան տարբեր տեսակի նշաններ.
Նախադասության ցուցիչ
Sentence Tokenizer-ը բազմաթիվ նախադասություններ վերածում է նախադասությունների զանգվածի: Սա արվում է օգտագործելով «punkt» գրադարանը, որն ապահովում է, որ մենք չենք բաժանվում հապավումների վրա, օրինակ. A.I-ն ունի վերջակետ, բայց չի նշանակում նախադասության վերջ: Նմանապես այն ապահովում է, որ մենք բաժանում ենք կետ, հարցական և այլն:
Word Tokenizer
Word tokenizer-ը նախադասությունները վերածում է առանձին բառերի: Այն պահում է կետադրական նշանները որպես բառ:
Tweet Tokenizer
Tweet tokenizer-ն օգտագործվում է թվիթերի թվիթերը թոքենիզացնելու համար: Սա հիանալի է, եթե մեր նախադասությունների մեջ կան էմոջիներ կամ այլ նշաններ: Ստորև բերված օրինակում խնդրում ենք նկատի ունենալ, որ «tokenizer» բառը բաժանում է խորհրդանիշը :D, բայց թվիթերի նշանաբանը հասկացել է, որ այն հայտնի նշան է և չի բաժանում այն:
Խոսքի հատկորոշման մաս
Խոսքի մասի (POS) հատկորոշումը NLP-ի կարևոր մասն է, որն օգնում է բացահայտել յուրաքանչյուր բառի գործառույթը նախադասության կամ արտահայտության մեջ: Խոսքի մասի հատկորոշումը նախադասության յուրաքանչյուր բառին խոսքի մաս հատկացնելու գործընթացն է: Խոսքի ամենատարածված մասերն են գոյականը, բայը, ածականը, դերանունը և այլն:
Կան մի քանի գրադարաններ, որոնք կատարում են POS պիտակավորում՝ nltk, spaCY և այլն:
Մենք կխոսենք այն մասին, թե ինչպես է POS հատկորոշումը կատարվում առանձին հոդվածում, սակայն ամենատարածված մեթոդը թաքնված Մարկովյան մոդելն է:
POS հատկորոշման ընդհանուր տեսակներն են.
- Գոյական (NN)՝ անձ, տեղ, բան կամ գաղափար
- Բայ (VB): Գործողություն կամ երևույթ
- Ածական (JJ): Բառ, որը նկարագրում է գոյական կամ դերանուն
- Բառ (RB): Բառ, որը նկարագրում է բայ, ածական կամ այլ բայ
- Դերանուն (PRP): Բառ, որը զբաղեցնում է գոյականի տեղը
- Կապակցում (CC): Բառ, որը կապում է բառերը, արտահայտությունները կամ դրույթները
- Նախադասություն (IN): Բառ, որը ցույց է տալիս կապը գոյականի կամ դերանունի և նախադասության այլ տարրերի միջև
- Ներարկում (UH): Բառ կամ արտահայտություն, որն օգտագործվում է ուժեղ հույզեր արտահայտելու համար
import nltk nltk.download('averaged_perceptron_tagger') text = "The quick brown fox jumps over the lazy dog." # Tokenize the text into words tokens = nltk.word_tokenize(text) # Perform part-of-speech tagging on the tokenized words tagged_words = nltk.pos_tag(tokens) print(tagged_words)
Դրա համար արդյունքը հետևյալն է.
[('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN'), ('.', '.')]
Խոսքի մասի հատկորոշման որոշ ներկայիս հիմնական ալգորիթմներից են Viterbi ալգորիթմը, Brill tagger, Constraint Grammar և Baum-Welch ալգորիթմը (նաև հայտնի է որպես առաջ-հետընթաց ալգորիթմ): Թաքնված Մարկովի մոդելը և տեսանելի Մարկովի մոդելը պիտակները կարող են իրականացվել Viterbi ալգորիթմի միջոցով: [Աղբյուր՝ Վիքի ]։ Այս բոլոր ալգորիթմների մասին մենք մանրամասն կանդրադառնանք ապագայում:
Նորմալացում
Նորմալացումը բառերի թեքումը հեռացնելու գործընթաց է: Ինչպես արդեն նշեցինք, ընկերությունների մեծ մասը մեր խնդրի շրջանակը կրճատում է միայն բառերով և բառերի հերթականությամբ: Այնուամենայնիվ, դեռ կան միլիոնավոր և միլիոնավոր բառեր, որոնց յուրաքանչյուր բառը փոխվում է լարվածության և բազմակարծության հետ:
Մեր կորպուսումեզակի բառերի քանակի չափը նվազեցնելու համար, որպեսզի մեր AI-ն կարողանա արագ հեռացնել ավելորդ տեղեկատվությունը և սովորել կարևոր տարբերությունները, մենք նորմալացնում ենք բառերը: Հետևաբար, քերականությունների հեռացումը, որը չի ազդում տեքստի մշակման վրա և չի փոխում նախադասության իմաստը՝ մշակման ժամանակը և պահանջվող հաշվողական ռեսուրսը բարելավելու համար, կոչվում է նորմալացում: Այն հեռացնելու համար եկեք օգտագործենք այնպիսի մեթոդներ, ինչպիսիք են Սթեմինգը և լեմմատիզացիան՝ թեքումը կտրելու համար:
Օրինակ:
- աշխատել, աշխատել, աշխատել, աշխատել =› աշխատանք
Սխալը դաշեղված (կամ երբեմն ծագած) բառերը իրենց բառի բուն, հիմք կամ արմատային ձևինվազեցման գործընթաց է — ընդհանրապես գրավոր բառի ձևը: Այն սովորաբար ներառում է ածանցյալ ածանցներիհեռացում:
Լեմմատիզացիան հիմնված էխոսքի մասի և բառի նշանակման ճշգրիտ որոշման վրա: >հիմնված դրա համատեքստի վրա: Սա նշանակում է, որ այն հաշվի է առնում, թե որտեղ է շեղված բառը ընկնում նախադասության մեջ, ինչպես նաև այդ նախադասության շուրջ ավելի մեծ համատեքստում, օրինակ՝ հարևան նախադասությունները կամ նույնիսկ մի ամբողջ փաստաթուղթ: Այն սովորաբար նպատակ ունի հեռացնել թեքական վերջավորությունները միայն և վերադարձնել բառի հիմքը կամ բառարանը ձևը, որը հայտնի է որպես լեմմա:
Ստեմինգ ընդդեմ լեմմատիզացիայի
Ե՛վ բխող, և՛ լեմմատիզացիան հեռացնում է շեղումը բառից: Այնուամենայնիվ, արմատավորումն առաջացնում է բառեր, որոնք չկան բառարանում, քանի որ այն չի օգտագործում խոսքի պիտակավորման որևէ մաս, բառապաշարներ և քերականական հարաբերություններ բառերի հետ, մինչդեռ. Լեմմատիզացիան քայլ առ քայլ օգտագործեք վերը նշված բոլոր գործընթացները և ստացեք ցանկալի բառ:
Լեմմատիզացիան ավելի դանդաղ է, բայց ավելի ճշգրիտ՝ ավելի նորմալացված կորպուս կառուցելիս:
Կան մի քանի Stemming մեթոդներ, բայց մենք պարզապես ցույց կտանք Porter Stemming-ի օրինակ այստեղ: Մեկ այլ հայտնի և ավելի ագրեսիվ ցողունային մոտեցում էLancaster Stemmingմոտեցումը: Սթեմինգի տարբեր մոտեցումների տարբերությունների մասին կխոսենք մեկ այլ հոդվածում։
Stop Words
Եկեք վերադառնանք երեխայի օրինակին: Այս սցենարում, եթե մենք սկսեինք չափազանց շատ եզակի բառեր արտասանել երեխայի առջև, նրան ավելի երկար կպահանջվեր կենտրոնանալու և հասկանալու համար, թե ինչպես կարելի է խոսել կարևոր բառեր, ինչպիսին է «մայրը»: Ուստի, ընդհանուր առմամբ, երեխայի առաջին բառերն այն բառերն են, որոնք ավելի հաճախ են կրկնվում և դրանք էական նշանակություն ունեն: Պատկերացրեք, որ երեխայի առաջին բառը «և» է, քանի որ այն շատ հաճախ է ասվում պատմություններում կամ «The» բառում: Որոշ իրական դեպքերում երեխան իրոք սովորեց «ոչ»-ը որպես առաջին բառերը, այնուամենայնիվ, ծնողներից շատերը կցանկանային, որ դա ավելի նշանակալից բառ լիներ, օրինակ՝ մոր կամ հոր տարբերակ:
Նմանապես, արհեստական ցանցերի դեպքում մենք կցանկանայինք անել նույնը և հեռացնել բառերը, որոնք աննշան են, որպեսզի արհեստական նեյրոնային ցանցերը կարողանան արագ հասկանալ կորպուսի նշանակալի բառերի իմաստը:
Կանգառ բառերը սովորական բառեր են, որոնք մեծ նշանակություն չեն տալիս տեքստին: Այս բառերը պետք է հեռացվեն նախնական մշակման փուլում, եթե ոչ, ապա դա աղմուկ է առաջացնում տեքստը մշակելիս:
Օրինակներ՝
- Շաղկապներ՝ համար, և, ոչ, բայց, կամ, դեռ, և այլն
- Հոդվածներ՝ a, an, the
NLTK-ն անգլերենի համար նախապես սահմանված կանգառ բառեր ունի, այն կարող է ներմուծվել stopwords.words («անգլերեն») միջոցով: Նշում.Չկա նախապես սահմանված ցուցակ, որը համաձայնեցված է բոլորի կողմից, և տարբեր գրադարաններ ունեն տարբեր թվով կանգառներ:
nltk.corpus ներմուծման կանգառ բառերից թույլ է տալիս ներմուծել կանգառների մոդուլը:
- Tokenizer-ն օգտագործվում է տեքստից նշաններ ստանալու համար
- Նշաններից ստոպ բառերը հանվում են:
Կոդի նմուշ.
import nltk from nltk import word_tokenize from nltk.corpus import stopwords stopwords=set(stopwords.words('english')) text="We are having fun learning Artificial Intelligence." tokens=word_tokenize(text) print(tokens) >> ['We', 'are', 'having', 'fun', 'learning', 'Artificial', 'Intelligence', '.'] text_without_stopwords=[w for w in tokens if not w in stopwords] print(text_without_stopwords) # The word 'are' is removed >> ['We', 'having', 'fun', 'learning', 'Artificial', 'Intelligence', '.']
Առանձնահատկությունների արդյունահանում
Տվյալներն այժմ բաժանված են ավելի փոքր նշանների, որոնք կարող են հեշտությամբ մշակվել, աղմուկը հանվում է տվյալներից և բառերը փոխակերպվել են իրենց ծագման ցողունին՝ կորպուսի չափը նվազեցնելու համար: Այնուամենայնիվ, համակարգիչը չի կարողանում հասկանալ բառերը: Դա նման է ռուսերեն սովորեցնել անգլերեն խոսողին ռուսերենով: Մենք պետք է փոխարկենք մարդկային նշանները մեքենայական ընթեռնելի թվերի, որպեսզի մեքենան կարողանա հասկանալ մարդու լեզուն:
Հետևաբար, մենք պետք է օգտագործենք որոշակի մեթոդ՝ նախքան դրանք մոդելավորելը, մեր փաստաթղթում բառերին կշիռներ հատկացնելու համար: Մենք գնում ենք առանձին բառերի թվային ներկայացման, քանի որ համակարգչի համար հեշտ է մշակել թվերը: Շատ դեպքերում մենք գնում ենք բառի կամ նշանի ներդրման:
Մենք առանձնացնում ենք առանձնահատկությունները տարբեր տեխնիկայի միջոցով և ձևավորում ենք Բառի ներկառուցումներ:
ՆՇՈՒՄ. Նախքան գործառույթների արդյունահանումը և բառերի ներկառուցումը ստեղծելը, մենք պետք է կատարենք նշանների ձևավորում և վերը թվարկված նախնական մշակման այլ քայլեր:
Բառի ներդրում
Բառի ներկառուցումը կամ բառի վեկտորը մոտեցում է, որով մենք ներկայացնում ենք փաստաթղթեր և բառեր: Այն սահմանվում է որպես թվային վեկտորային մուտքագրում, որը թույլ է տալիս նմանատիպ նշանակություն ունեցող բառերին ունենալ նույն ներկայացումը: Այն կարող է մոտավոր նշանակություն ունենալ և ներկայացնել բառը ավելի ցածր ծավալային տարածության մեջ:
Բառերի ներկառուցման բազմաթիվ մեթոդներ կան: Գոյություն ունեն երկու տեսակի վեկտորներ, որոնք կառուցված են՝ Sparse Embedding Vectors և Dense Embedding Vectors:
նոսր ներկառուցումներ
նոսր վեկտորի ներդրումը շատ մեծ չափման վեկտոր է (օրինակ՝ 100,000), որտեղ նրա մուտքերի միայն մի փոքր մասն է զրոյական չէ: Տեքստի որոնման ժամանակ նոսր վեկտորները սովորաբար ներկայացնում են տերմինի մակարդակի կարևորությունը փաստաթղթերի և հարցումների համար:
- Բառերի տոպրակ
- N-գրամ
- TF-IDF
Խիտ ներկառուցումներ
խիտ վեկտորի ներկառուցումը ֆիքսված չափերի վեկտոր է, սովորաբար 100–1000 միջակայքում, որտեղ յուրաքանչյուր մուտքագրում գրեթե միշտ զրոյական չէ: Տեքստի որոնման ժամանակ, օրինակ, նրանք կարող են ներկայացնել տեքստերի իմացած իմաստային նշանակությունը ML մոդելների կողմից, ինչպիսին է SBERT-ը:
- Word2vec
- Ձեռնոց (գլոբալ վեկտորներ)
Բառերի տոպրակ
Բառերի պարկը ներկայացնում է փաստաթղթում բառերի առաջացումը: Այստեղ մենք կհաշվեինք, թե քանի անգամ են եզակի բառերը առկա փաստաթղթում կամ եզակի հավաքածուում: Այս մոտեցումը փաստաթղթերից առանձնահատկություններ հանելու պարզ և ճկուն միջոց է:
# For two files: # Document1: [John likes to watch movies. Mary likes movies too.] # Document2: [Mary also likes to watch football games.] BoW1 = {"John":1,"likes":2,"to":1,"watch":1,"movies":2,"Mary":1,"too":1}; BoW2 = {"Mary":1,"also":1,"likes":1,"to":1,"watch":1,"football":1,"games":1};
Բառերի պարկը թքած ունի բառերի հերթականության վրա և ամբողջովին անտեսում է բառերի կամ նշանների հերթականությունը: Սա նշանակում է, որ այն կարող է օգտակար լինել միայն այն դեպքում, եթե մենք մտահոգված լինենք օգտագործվող բառերով, բայց ոչ բառերի օգտագործման հաջորդականությամբ:
Օրինակ. «Գեղեցիկ տեսք ունեմ» և «Գեղեցիկ տեսք ունեմ»-ը նույն վեկտորային ձևաչափն են լինելու «Բառերի տոպրակի» դեպքում:
Նախամշակման քայլ՝
Եկեք ներմուծենք բոլոր անհրաժեշտ գրադարանները NLTK-ից՝ կատարելու ավելի վաղ քննարկված նախնական մշակման տեխնիկան, ինչպիսիք են Tokenization, Normalization, Ignoring Stop բառերը: Բացի այդ, ստորև կոդում լեմմատիզացիա կատարելիս հատուկ նիշերը հանվում են և տեքստի մեծատառը փոխվում է փոքրի, որպեսզի կատարվի նույնական տառատեսակ ամբողջ տեքստի հետ:
Ներմուծեք անհրաժեշտ գրադարանները և բեռնեք տեքստը
Tensorflow մոտեցումը Վիքիպեդիայից.
# Make sure to install the necessary packages first # pip install --upgrade pip # pip install tensorflow from tensorflow import keras from typing import List from keras.preprocessing.text import Tokenizer sentence = ["John likes to watch movies. Mary likes movies too."] def print_bow(sentence: List[str]) -> None: tokenizer = Tokenizer() tokenizer.fit_on_texts(sentence) sequences = tokenizer.texts_to_sequences(sentence) word_index = tokenizer.word_index bow = {} for key in word_index: bow[key] = sequences[0].count(word_index[key]) print(f"Bag of word sentence 1:\n{bow}") print(f"We found {len(word_index)} unique tokens.") print_bow(sentence)
Արդյունք:
Bag of word sentence 1: {'likes': 2, 'movies': 2, 'john': 1, 'to': 1, 'watch': 1, 'mary': 1, 'too': 1} We found 7 unique tokens.
NLTK մոտեցման համար.
# Import Necessary Libraries from NLTK import nltk from nltk import word_tokenize from nltk.stem import WordNetLemmatizer from nltk.corpus import stopwords # Defined Sample Corpus text="I like this car. It has GPS navigation. It price also very cheap." # Download & Define English Stopwords nltk.download('stopwords') stopwords=set(stopwords.words('english'))
Տեքստի նախնական մշակում և բառապաշար
Բառապաշարների հավաքումը կարող է իրականացվել երկու եղանակով. Իրականացման հեշտ միջոցը count vectorizer-ն է Scikit-learn-ից կամ հետևելով բոլոր նախնական մշակման քայլերին և վեկտորացնել այն:
Բառապաշարների հավաքածու առանց Count Vectorizer
# Define a list to store all vocabulary L=[] #Tokenization tokens=word_tokenize(text) #Remove Stop words text_without_stopwords=[w for w in tokens if not w in stopwords] #Lemmatization lemmatizer = nltk.stem.WordNetLemmatizer() W=[lemmatizer.lemmatize(w.lower()) for w in text_without_stopwords if w!="."] # Use "set" to get unique words and sort it in ascending order. L=sorted(list(set(W))) # print list print(L)
Արդյունք:
print(L) ['also', 'car', 'cheap', 'gps', 'i', 'it', 'like', 'navigation', 'price']
Բառապաշարների հավաքածու Count Vectorizer-ով
from sklearn.feature_extraction.text import CountVectorizer vectorizer=CountVectorizer() vectorizer.fit(text) vocabulary=vectorizer.get_feature_names()
Արդյունք:
print(vocabulary) ['also', 'car', 'cheap', 'gps', 'it', 'like', 'navigation', 'price']
Վեկտորատոր
Հաջորդը մենք պետք է փոխարկենք տեքստը վեկտորի: Ամենապարզ մեթոդը 1-ով և 0-ով բառերի առկայությունը բառի բացակայության դեպքում նշելն է: Դրա համար մենք պետք է իրականացնենք Count Vectorizer:
Առանց հաշվառման վեկտորատորի
Ստուգեք, թե արդյոք բառը առկա է փաստաթղթում, եթե այո, կցեք 1-ը, թե այլապես կցեք 0-ը:
bag_of_words=[] bag=[] for x,doc in enumerate(text): bag=[] w_temp=[lemmatizer.lemmatize(w.lower()) for w in doc] for w in L: if w in w_temp: bag.append(1) else: bag.append(0) bag_of_words.append(bag)
Count Vectorizer-ով
from nltk import sent_tokenize vectorizer=CountVectorizer() documents=sent_tokenize(text) X=vectorizer.fit_transform(documents)
Արդյունք:
print(X.toarray()) [[0 1 0 0 0 1 0 0 1 0 0] [0 0 1 1 1 0 0 0 0 1 0] [1 0 0 0 1 0 1 1 0 0 1]]
Ավելի լավ ըմբռնում.
import pandas as pd pd.DataFrame(X.toarray(), columns = vectorizer.get_feature_names())
Դիտարկենք 1-ին նախադասությունը «Ինձ դուր է գալիս այս մեքենան»: Այժմ դիտարկեք վեկտորը, որը տրված է count vectorizer-ով, որտեղ էլ նախադասության բառերը (այսինքն՝ «I», «like», «this», «car») այն նշում են որպես 1, բացի նրանից, որ այն նշվում է որպես 0:
N-գրամ
Ինչպես նշվեց, բառերի պարկը հաշվի չի առնում հերթականությունը։ Այս խնդիրը լուծելու համար մենք կարող ենք օգտագործել n-գրամներ, որոնք թույլ կտան մեզ վերցնել փաստաթղթում բառերի կամ նշանների կամ նշանների շարունակական հաջորդականություն: Տեխնիկական առումով դրանք կարող են սահմանվել որպես փաստաթղթի տարրերի հարևան հաջորդականություններ։
import re def generate_ngrams(s, n): # Convert to lowercases s = s.lower() # Replace all none alphanumeric characters with spaces s = re.sub(r'[^a-zA-Z0-9\s]', ' ', s) # Break sentence in the token, remove empty tokens tokens = [token for token in s.split(" ") if token != ""] # Use the zip function to help us generate n-grams # Concatentate the tokens into ngrams and return ngrams = zip(*[token[i:] for i in range(n)]) return [" ".join(ngram) for ngram in ngrams] # For bigram model (2-gram) model sentence = ["John","likes","to","watch","movies","Mary","likes","movies","too"] print(generate_ngrams(sentence, 2)) #Output >> [ "John likes", "likes to", "to watch", "watch movies", "Mary likes", "likes movies","movies too"]
Ինչպես տեսնում ենք վերևում, վեկտորային մատրիցայի տարրերի մեծ մասը կլինի 0, որը չի ավելացնում որևէ տեղեկատվություն, բայց վերցնում է արժեքավոր հիշողության տարածք: Ենթադրենք, մենք ունենք 1000 փաստաթղթերի հավաքածու, որը բաղկացած է ընդհանուր առմամբ 5000 եզակի բառից: Շատ միամիտ ձևով մենք կարող ենք պարզապես հաշվել յուրաքանչյուր փաստաթղթում յուրաքանչյուր բառի առաջացման թիվը, այնուհետև յուրաքանչյուր բառը ներկայացնել այս 1000-չափ վեկտորով: Սա հենց այն է, ինչ վերևում ցուցադրված է տերմինային փաստաթուղթմատրիցան:
Նմանապես, դիտարկեք 5000 եզակի բառերով տեքստի մեծ կորպուս: Այժմ վերցրեք որոշակի չափի պատուհան և յուրաքանչյուր բառային զույգի համար մենք հաշվում ենք, թե քանի անգամ է այն հայտնվում պատուհանում: Այս հաշվարկները կազմում են տերմինային մատրիցա, որը նաև կոչվում է համատեղեցման մատրիցորն այս դեպքում կլինի 5000x5000 մատրիցա (շատ բջիջներով 0, եթե պատուհանի չափը համեմատաբար է։ փոքր).
TF-IDF
Ժամկետի հաճախականությունըսահմանվում է որպես փաստաթղթում բառի հայտնվելու քանակի թիվը՝ բաժանված փաստաթղթում առկա բառերի ընդհանուր թվի վրա
Փաստաթղթերի հակադարձ հաճախականությունը սահմանվում է որպես փաստաթղթերի ընդհանուր թվի գրանցամատյան՝ բաժանված բառը պարունակող փաստաթղթերի թվի վրա: Ստորև բերված բանաձևերում 1-ը կարող է ներառել կամ չներառել, դա կախված է ձեր ցանկությունից: Դա պարզապես ստանդարտացման համար է:
TF-IDF-ը սահմանվում է որպես ժամկետային հաճախականության և փաստաթղթի հակադարձ հաճախականության արտադրյալ
TF_IDF հաշվարկի օրինակ
Ենթադրենք, որ 10000 բառանոց փաստաթղթում «համակարգ» բառը հայտնվում է 6 անգամ։ Հաշվե՞լ TF-ն:
Հետևաբար՝ TF=0.006
Ենթադրենք, որ 10000 փաստաթղթում «համակարգ» բառը հայտնվում է 60 անգամ։ Հաշվե՞լ IDF-ն:
Հետևաբար, IDF = 2,21
TF-IDF=0.006 * 2.21 = 0.0132
TfidfVetorizer-ը Scikit-learn-ից թույլ է տալիս կիրառել TF-IDF բառերի ներդրման տեխնիկա:
Կոդի նմուշ՝
#Defined the same text which is defined for Countvectorizer text="I like this car. It has GPS navigation. It price also very cheap" #Importing NLTK package and functions import nltk from nltk import sent_tokenize #Extract documents from text(corpus) sentences=sent_tokenize(text) #Extracted documents print(sentences) ['I like this car.', 'It has GPS navigation.', 'It price also very cheap'] #Importing Sklearn TF-IDF Vectorizer from sklearn.feature_extraction.text import TfidfVectorizer #Define TF-IDF tf_idf_vectorizer = TfidfVectorizer() #Extract Vectors for sentences X = tf_idf_vectorizer.fit_transform(sentences) #import pandas to create dataframe for better understanding import pandas as pd pd.DataFrame(X.toarray(), columns = tf_idf_vectorizer.get_feature_names())
Արդյունք:
Word2vec
Word2vec ալգորիթմը օգտագործում է նեյրոնային ցանցի մոդել՝ տեքստի մեծ կորպուսից բառերի ասոցիացիաներ սովորելու համար: Ուսուցանվելուց հետո նման մոդելը կարող է հայտնաբերել հոմանիշ բառեր կամ առաջարկել լրացուցիչ բառեր մասնակի նախադասության համար: Այն կանխատեսում է վեկտորները միայն հաշվի առնելով կանխատեսող բառի տեղական համատեղությունը: Բառի կանխատեսումը տեղի է ունենում պատուհանի չափի միջակայքը դիտելով:
Word2vec-ն իր մուտքն է ընդունում տեքստի մեծ կորպուսը և արտադրում է վեկտորային տարածություն, ընդ որում կորպուսի յուրաքանչյուր եզակի բառին հատկացվում է համապատասխան վեկտոր բացատում: Word2vec-ն օգտագործում է երկու ճարտարապետություններից որևէ մեկը՝ CBOW կամ շարունակական Skip-Gram:
CBOW-ում (Բառերի շարունակական պարկ) մենք փորձում ենք գուշակել բառը՝ շրջելով բազմաթիվ բառեր, մինչդեռ Skip-Gram-ում մենք փորձում ենք համատեքստային բառերը մոդելավորել տվյալ բառով: Ստորև բերված ճարտարապետությունը նույնն է ցույց տալիս:
Word2Vec-ում նմանատիպ բառերը ավելի մոտ են գտնվում վեկտորային տարածության մեջ: Բառերի վեկտորների վրա թվաբանական գործողությունները կարող են իմաստային հարաբերություններ առաջացնել:
Օրինակ՝ «արքա» — «տղամարդ» + «կին» =» «թագուհի»
GloVe (գլոբալ վեկտորներ)
GloVe-ն չվերահսկվող ուսուցման ալգորիթմ է՝ բառերը վեկտորներով ներկայացնելու համար: Այն ավելի լավ է ֆիքսում բառ-բառ համակցությունները ամբողջ կորպուսում, քան word2vec-ը: Այլ կերպ ասած, այն ստեղծում է համընդհանուր համակեցության մատրիցա՝ գնահատելով կորպուսում այլ բառերի հավանականությունը:
Ինչու՞ է Glove-ն ավելի լավ, քան Word2vec-ը:
Երկու մոդելներն էլ սկզբունքորեն նույնն են, նրանք վեկտորներ են սովորում համակցվածից: Այնուամենայնիվ, Word2vec-ը կանխատեսող մոդել է, իսկ GloVe-ը՝ հաշվի վրա հիմնված մոդել: GloVe-ի առավելությունն այն է, որ, ի տարբերություն Word2vec-ի, GloVe-ն չի հիմնվում միայն տեղական վիճակագրության վրա, այլ ներառում է գլոբալ վիճակագրություն՝ բառերի վեկտորներ ստանալու համար: Glove-ում ավելի հեշտ է ավելի շատ տվյալներ պատրաստել, քան word2vec-ը:
Երկու փաստաթղթերի միջև նմանության հաշվարկ
Երկու փաստաթղթերի նմանությունը երկու փաստաթղթերիհարեւան հաջորդականությունների հատումն էհարեւան հաջորդականությունների միավորման վրա: Այս սահմանումը նույնական է Jaccard գործակիցին, որը նկարագրում է նմուշների հավաքածուների նմանությունն ու բազմազանությունը:
Երկու փաստաթղթերի նմանությունը հաշվարկելու մյուս եղանակն է Կոսինուսի նմանությունը:
Կոսինուսի նմանությունը չափիչ է, որն օգտագործվում է չափելու համար, թե որքանով են նման փաստաթղթերը` անկախ դրանց չափից: Մաթեմատիկորեն այն հաշվարկում է բազմաչափ տարածության մեջ նախագծված երկու վեկտորների միջև անկյան կոսինուսը:
import numpy as np def cosine_similarity(x, y): # Ensure length of x and y are the same if len(x) != len(y) : return None # Compute the dot product between x and y dot_product = np.dot(x, y) # Compute the L2 norms (magnitudes) of x and y magnitude_x = np.sqrt(np.sum(x**2)) magnitude_y = np.sqrt(np.sum(y**2)) # Compute the cosine similarity cosine_similarity = dot_product / (magnitude_x * magnitude_y) return cosine_similarity
Եզրակացություն
Վերջապես, մենք ներկայացրեցինք նախնական մշակման բոլոր քայլերը և տարբեր եղանակներ՝ ինչպես նոսր, այնպես էլ խիտ ներդիրներ կառուցելու համար: Հետագա հոդվածներում մենք ավելի խորը կփորենք այս քայլերից յուրաքանչյուրի և այն մասին, թե ինչպես են տրանսֆորմատորները փոխել խաղը:
Ավելին, մենք կխոսենք նաև այն մասին, թե ինչպես է GPT-ի և լեզվական մեծ մոդելների կողմից ներառված ուժեղացման ուսուցումը առանցքային տեղաշարժ առաջացրել: Սա հանգեցրեց մեքենայական ուսուցման համայնքում ավելի քան երբևէ ուշադրություն դարձնելու բնական լեզվի մշակմանը:
Հավելված
Հատկությունների արդյունահանում և ներդրում NLP-ում. Բնական լեզուն հասկանալու համար սկսնակների ուղեցույց…
Այս հոդվածը հրապարակվել է որպես «Տվյալների գիտության բլոգաթոն բնական լեզվի մշակման, առանձնահատկությունների արդյունահանման մի մաս… www.analyticsvidhya.com»