N-grame. Îmbunătățirea optimizării interne cu ajutorul concurenților Vezi ce este „N-gram” în alte dicționare

Folosind N-grame

Utilizarea generală a N-gramelor

  • extragerea datelor pentru a grupa o serie de imagini satelitare ale Pământului din spațiu, pentru a decide apoi ce părți specifice ale Pământului sunt în imagine,
  • căutarea secvențelor genetice,
  • în domeniul geneticii sunt utilizate pentru a determina de la ce specii de animale specifice sunt colectate probe de ADN,
  • în compresia computerizată,
  • folosind N-grame, de regulă, datele referitoare la sunet sunt indexate.

N-gramele sunt, de asemenea, utilizate pe scară largă în procesarea limbajului natural.

Utilizarea N-gramelor pentru nevoile de procesare a limbajului natural

În domeniul prelucrării limbajului natural, N-gramele sunt utilizate în principal pentru predicție bazată pe modele probabilistice. Modelul N-gramă calculează probabilitatea ultimului cuvânt al N-gramei dacă toate cele precedente sunt cunoscute. Când folosiți această abordare pentru a modela o limbă, se presupune că aspectul fiecărui cuvânt depinde numai de cuvintele anterioare.

O altă aplicație a N-gramelor este detectarea plagiatului. Dacă împărțiți textul în mai multe fragmente mici, reprezentate prin n-grame, acestea pot fi comparate cu ușurință între ele, obținând astfel gradul de similitudine al documentelor controlate. N-gramele sunt adesea folosite cu succes pentru a clasifica textul și limba. În plus, ele pot fi folosite pentru a crea funcții care vă permit să obțineți cunoștințe din datele text. Folosind N-grame se pot găsi eficient candidați pentru a înlocui cuvintele scrise greșit.

Proiecte de cercetare Google

Centrele de cercetare Google au folosit modele N-gram pentru o gamă largă de cercetări și dezvoltare. Acestea includ proiecte precum traducerea statistică dintr-o limbă în alta, recunoașterea vorbirii, corectarea ortografiei, extragerea informațiilor și multe altele. În scopul acestor proiecte, s-au folosit texte corpus care conțin câteva trilioane de cuvinte.

Google a decis să-și creeze propria clădire educațională. Proiectul se numește Google teracorpus și conține 1.024.908.267.229 de cuvinte colectate de pe site-uri publice.

Metode de extragere a n-gramelor

Datorită utilizării frecvente a N-gramelor pentru rezolvarea diferitelor probleme, este nevoie de un algoritm de încredere și rapid pentru a le extrage din text. Un instrument adecvat de extracție de n-grame ar trebui să poată funcționa cu dimensiunea nelimitată a textului, să funcționeze rapid și să utilizeze eficient resursele disponibile. Există mai multe metode pentru extragerea N-gramelor din text. Aceste metode se bazează pe diferite principii:

Note

Vezi si


Fundația Wikimedia. 2010 .

  • n-tv
  • N-caderina

Vedeți ce este „N-gram” în alte dicționare:

    GRAM- (gramă franceză, din greacă gramma trăsătură). unitate franceza. greutate \u003d greutate de 1 centimetru cub de apă distilată \u003d 22,5 rusă. acțiuni. Dicționar de cuvinte străine incluse în limba rusă. Chudinov A.N., 1910. GRAM unitate de măsură a greutății în Franța... Dicționar de cuvinte străine ale limbii ruse

    gram- gram, gen. pl. grame și permise (în vorbirea orală după cifre) grame. O sută de grame (grame). În apărarea noii forme a genului. caz pl. numărul de grame a fost făcut de un cunoscător al scriitorului de limba rusă K. Chukovsky. Iată ce a scris el în cartea „Living as Life”: ... ... Dicționar de pronunție și dificultăți de stres în limba rusă modernă

    GRAM- GRAM, grame, soț. (din greacă semn gramatică, literă). Unitatea de bază de greutate în sistemul metric, egală cu greutatea a 1 centimetru cub de apă. Un gram cântărește aproximativ 1/400 de kilogram. ❖ Atom gram (fizic) numărul de grame dintr-o substanță egal cu greutatea sa atomică. ... ... Dicționar explicativ al lui Ushakov

    gram-roentgen- gram X-ray / n, gram X-ray / pe, tijă. pl. gram roentgen și gram roentgen... comasate. Aparte. Printr-o cratimă.

    gram- Bună, acest simplu cuvânt nu ar fi putut fi dat în dicționarul erorilor, dacă nu în două împrejurări; în primul rând, dacă doriți să vă arătați cu un limbaj absolut corect, atunci, după ce ați venit la magazin, uimește vânzătorul cu cel corect: Cântărește-mă două sute de grame (nu ... ... Dicționar de greșeli în limba rusă

    GRAM-ATOM- GRAM ATOM, cantitatea unui element a cărui masă, în grame, este egală cu MASA ATOMULUI său. A fost înlocuit cu molul unității SI. De exemplu, un gram de atom de hidrogen (H, masa atomică = 1) este egal cu un gram. b>ECHIVALENT GRAM, greutatea în grame a aceluia… … Dicționar enciclopedic științific și tehnic

    GRAM- GRAM, ah, gen. pl. grame și grame, soț. O unitate de masă în sistemul zecimal de măsuri, o miime de kilogram. Nici o uncie (nu) de nimic (colocvial) deloc, deloc. Acest om (nu are) un gram de conștiință. | adj. gram, oh, oh. Explicativ ...... Dicționar explicativ al lui Ozhegov

    gram- dar; pl. gen. grame și grame; m. [franceză. gram] O unitate de masă în sistemul metric, o miime de kilogram. ◊ Nu există (un singur) gram. Deloc, deloc. În care l. nici un gram de minciună. Nimeni nu are un pic de conștiință. * * * grame (franceză... Dicţionar enciclopedic

    Gramm Zenob Theophilus- (Gramme) (1826 1901), inginer electrician. Născut în Belgia, a lucrat în Franța. A primit un brevet pentru un generator electric practic cu o armătură inelară (1869). A fondat producția industrială de mașini electrice. * * * GRAM Zenob… … Dicţionar enciclopedic

    atom gram- cantitatea unei substanţe în grame, numeric egală cu masa sa atomică. Termenul nu este recomandat pentru utilizare. În SI, cantitatea unei substanțe este exprimată în moli. * * * GRAM ATOM GRAM ATOM, cantitatea unei substanțe în grame, numeric egală cu masa sa atomică (vezi... Dicţionar enciclopedic

    moleculă gram- cantitatea unei substanţe în grame, numeric egală cu greutatea sa moleculară. Termenul nu este recomandat pentru utilizare. În SI, cantitatea unei substanțe este exprimată în moli. * * * MOLECULĂ DE GRAM MOLECULĂ DE GRAM, cantitatea unei substanțe în grame, egală numeric cu ... ... Dicţionar enciclopedic

Miez semantic

Pentru a dezvolta cu succes și a crește vizibilitatea site-ului în realitățile moderne, este necesară extinderea constantă a nucleului semantic. Una dintre cele mai bune moduri de a crește este să colectezi cuvinte cheie ale concurenței.

Astăzi, nu este greu să obții semantica concurenților, pentru că. Există multe servicii, atât plătite, cât și gratuite.

Lista gratuită:

— megaindex.ru — Instrument de vizibilitate a site-ului

- xtool.ru - un serviciu binecunoscut care arată și cuvintele cheie pentru care site-ul este clasat

Lista plătite:

— spywords.ru — potrivit pentru Yandex și Google

- semrush.ru - concentrat doar pe Google

— prodvigator.ua — analog ucrainean al spywords.ru

Pe lângă servicii, puteți utiliza și o metodă manuală bazată pe împărțirea titlului și a descrierii în n-grame, în urma căreia se obține o listă suplimentară de fraze la ieșire.

N-gram - o succesiune de n elemente. În practică, N-grama este mai comună ca o serie de cuvinte. O succesiune de două elemente consecutive este adesea numită diagramă, se numește o succesiune de trei elemente trigramă. Cel puțin patru sau mai multe elemente sunt desemnate ca N-gram, N este înlocuit cu numărul de elemente consecutive.

Luați în considerare această tehnică pas cu pas:

- Încărcați titlul (descrierea) concurenților. Se poate face cu Screaming Frog SEO.

- Într-un editor de text, curățăm lista rezultată de părțile de vorbire de serviciu, semnele de punctuație și alte gunoaie. Folosesc funcția „căutare și înlocuire” din editorul de text sublim text (tasta rapidă ctrl+H), folosind expresii regulate:

- Selectați n-gramul dorit și setați frecvența la cel puțin unul. Cea mai bună opțiune sunt trigramele și 4 grame:

- obținem următorul rezultat:

Coloanănumaraarată numărul de repetărin-gram, coloanăfrecvență - frecvențăn-grame.

După ce am primit o listă de fraze, trebuie să o analizăm și să selectăm cuvintele cheie adecvate pentru a extinde nucleul semantic. Mai multe detalii pot fi găsite în secțiunea relevantă a blogului nostru.

Cereri de grupare

Este foarte important să înțelegem cum este grupat nucleul semantic al concurenților, deoarece acest lucru ajută la distribuirea corectă a frazelor cheie pe paginile site-ului.

Pentru a face acest lucru, după ce am format o listă completă de solicitări, trebuie să obținem pagini și poziții relevante ale concurenților (puteți folosi serviciul seolib.ru) și apoi să comparăm cu gruparea noastră. Dacă puteți vedea că un concurent are poziții bune și, în același timp, gruparea lui diferă de a noastră (de exemplu, cererile unui concurent sunt distribuite pe pagini diferite, în timp ce a noastră are aceleași solicitări pe o singură pagină), trebuie să fiți atenți la acest lucru și revizuiți paginile de destinație de pe site-ul dvs.

Să luăm în considerare un mic exemplu de comparare a grupării unui site condiționat și a concurentului său.

După cum puteți vedea din tabel, site.ru are o singură pagină de destinație pentru toate cuvintele cheie. La un concurent, diferite pagini sunt clasate pentru aceleași interogări și ocupă pozițiile TOP sau aproape de TOP. Pe baza acestui fapt, putem concluziona că gruparea de pe site.ru trebuie revizuită, în special, este necesar să se creeze o pagină separată pentru frazele cheie cu cuvântul „fațadă”.

Calitatea textului

Primul și cel mai important lucru la care trebuie să acordați atenție atunci când analizați textele concurenților nu este componenta cantitativă (număr de apariții, lungimea textului etc.), ci cea calitativă sau semantică - cât de utilă este informația, ce oferă concurentul și cum face el.

Să ne uităm la câteva exemple.

Să presupunem că livrați flori și pe pagina principală din text le garantați prospețimea. De exemplu, așa:

Serviciu de livrare florisite-ul. rogaranteaza siguranta buchetelor chiar si in sezonul rece.

Iată un exemplu de la unul dintre concurenți:

Este profitabil să comandați compoziții parfumate de la noi, deoarece vă garantăm 100% garanție de returnare a banilor în cazul în care prospețimea florilor este la îndoială.

Garanția unui concurent este susținută de bani, ceea ce este mai semnificativ decât o garanție abstractă.

Luați în considerare un alt exemplu - textul de pe pagina categoriei „plăci ceramice” a unui magazin online:

Acest text nu poartă nicio încărcătură semantică utilă, apă solidă. Cel mai probabil, persoana care a venit pe site și ia o decizie de cumpărare vrea să cunoască beneficiile produsului și posibilele configurații, în schimb primește un set de caractere fără sens.

Acum să ne uităm la textul unui concurent:

Acest text este mai util deoarece comunică succint diferențele dintre plăci și vă ajută să înțelegeți cum să o alegeți pe cea potrivită.

Astfel, comparând textele concurenților cu ale dvs., puteți obține o mulțime de informații utile care îi vor ajuta pe copywriteri la compilarea TOR.

Relevanța textelor

Continuând tema calității textelor, nu se poate să nu atingă relevanța acestora. Astăzi, pentru ca textul să fie relevant, nu este suficient să includeți doar cuvinte cheie. Pentru a crește relevanța paginii și, în același timp, a nu face ca textul să fie spam, trebuie să folosiți cuvinte legate de subiect.

Atunci când evaluează relevanța unui text pentru o interogare, motorul de căutare analizează nu numai prezența cuvintelor cheie, ci și a cuvintelor suplimentare, determinând astfel sensul textului. De exemplu, dacă scriem un text despre un elefant, atunci cuvintele înrudite pot fi considerate: „trunchi”, „colți”, „natura”, „grădina zoologică”. Dacă textul despre piesa de șah este „elefant”, atunci aceste cuvinte vor fi: „figura”, „cec”, „regina”, etc.

Puteți obține cea mai potrivită listă de cuvinte pentru nevoile dvs. în textele concurenților. Pentru a face acest lucru, trebuie să efectuați următorii pași:

— Copiem toate textele din TOP-10 pentru solicitarea dorită de înaltă frecvență în fișiere text diferite.

- Înlăturăm părțile de vorbire de serviciu, semnele de punctuație și numerele din texte (luate în considerare mai devreme).

- Aliniați cuvintele într-o linie - utilizați funcția „căutare și înlocuire” cu expresii regulate. Înlocuiește spațiul cu \n.

- În continuare, trebuie să aduceți toate formele de cuvinte la forma normală de dicționar (lemă). Pentru a face acest lucru, puteți utiliza serviciul https://tools.k50project.ru/lemma/. În câmp, introduceți o listă de cuvinte din fiecare fișier separat și faceți clic pe butonul „lemmetize and output as a csv table”. Rezultatul ar trebui să fie 10 fișiere cu cuvinte lemmetizate.

- În fiecare fișier, eliminăm cuvintele duplicat.

- Combinați cuvintele din fișiere într-o singură listă.

— Acum trebuie să creăm un dicționar de frecvență. Pentru a face acest lucru, adăugați lista rezultată la serviciu https://tools.k50project.ru/lemma/ și faceți clic pe „construiți un dicționar de frecvență sub formă de CSV”.

- Lista noastră de cuvinte este gata:

Dacă frecvența este 10, atunci acest cuvânt a fost folosit pe toate cele 10 site-uri, dacă 8, atunci numai pe 8 etc. Vă recomandăm să folosiți cele mai frecvente cuvinte, totuși, printre cuvintele rare pot fi găsite soluții interesante.

Într-un mod atât de simplu, puteți obține o listă de cuvinte tematice pentru compilarea TOR pentru copywriteri.

După cum puteți vedea, concurenții sunt o sursă foarte importantă de informații care vă poate ajuta să vă optimizați mai bine site-urile. În acest articol, am acoperit departe de toate aspectele, iar pe viitor voi continua să scriu despre ce este util și cum poți învăța de la concurenții tăi.

Aboneaza-te la Newsletter Acești algoritmi sunt proiectați să caute pe text necunoscut anterior și pot fi utilizați, de exemplu, în editori de text, vizualizatoare de documente sau browsere web pentru a căuta într-o pagină. Nu necesită preprocesare a textului și pot funcționa cu un flux continuu de date.

Căutare liniară

O simplă aplicare secvențială a unei metrici date (de exemplu, metrica Levenshtein) la cuvintele din textul introdus. Când utilizați o metrică cu o limită, această metodă vă permite să obțineți performanțe optime. Dar, în același timp, cu atât mai mult k, cu cât timpul de rulare crește. Estimarea timpului asimptotic - OK n).

Bitap (cunoscut și ca Shift-Or sau Baeza-Yates-Gonnet și modificarea sa din Wu-Manber)

Algoritm bitap iar diferitele sale modificări sunt cel mai adesea folosite pentru căutarea neclară fără indexare. Variația sa este folosită, de exemplu, în utilitarul unix agrep , care îndeplinește funcții similare cu grep standard, dar cu suport pentru erori în interogarea de căutare și chiar oferă oportunități limitate de utilizare a expresiilor regulate.

Pentru prima dată, ideea acestui algoritm a fost propusă de cetățeni Ricardo Baeza-YatesȘi Gaston Gonnet, publicând un articol similar în 1992.
Versiunea originală a algoritmului se ocupă doar de substituțiile de caractere și calculează de fapt distanța Hamming. Dar puțin mai târziu soare wuȘi Udi Manber a propus o modificare a acestui algoritm pentru a calcula distanța Levenshtein, adică a adus suport pentru inserări și ștergeri și a dezvoltat prima versiune a utilitarului agrep pe baza acestuia.






Valoarea rezultatului

Unde k- numărul de greșeli, j- indice de caractere, s x - mască de caractere (în mască, biții unici sunt localizați în pozițiile corespunzătoare pozițiilor caracterului dat în cerere).
O potrivire sau nepotrivire cu interogarea este determinată de ultimul bit al vectorului R rezultat.

Viteza mare a acestui algoritm este asigurată de paralelismul biților al calculelor - într-o singură operație este posibil să se efectueze calcule pe 32 sau mai mulți biți simultan.
În același timp, implementarea trivială acceptă căutarea cuvintelor cu o lungime de cel mult 32. Această limitare este determinată de lățimea tipului standard. int(pe arhitecturi pe 32 de biți). Puteți utiliza și tipuri de dimensiuni mari, dar acest lucru poate încetini într-o oarecare măsură algoritmul.

În ciuda faptului că timpul de rulare asimptotic al acestui algoritm OK n) este aceeași cu metoda liniară, este mult mai rapidă cu interogări lungi și cu numărul de erori k peste 2.

Testare

Testarea a fost efectuată pe un text de 3,2 milioane de cuvinte, lungimea medie a cuvintelor a fost de 10.
Căutare exactă
Timp de căutare: 3562 ms
Căutați folosind valoarea Levenshtein
Ora de căutare la k=2: 5728 ms
Ora de căutare la k=5: 8385 ms
Căutați folosind algoritmul Bitap cu modificări Wu-Manber
Ora de căutare la k=2: 5499 ms
Ora de căutare la k=5: 5928 ms

Evident, o enumerare simplă folosind metrica, spre deosebire de algoritmul Bitap, este foarte dependentă de numărul de erori. k.

Cu toate acestea, atunci când vine vorba de căutarea unor cantități mari de text neschimbat, timpul de căutare poate fi redus semnificativ prin preprocesarea unui astfel de text, numit și indexarea.

Algoritmi de căutare neclară cu indexare (offline)

O caracteristică a tuturor algoritmilor de căutare fuzzy cu indexare este că indexul este construit conform unui dicționar compilat din textul sursă sau o listă de înregistrări dintr-o bază de date.

Acești algoritmi folosesc abordări diferite pentru a rezolva problema - unii dintre ei folosesc reducerea pentru căutarea exactă, alții folosesc proprietățile metricii pentru a construi diferite structuri spațiale și așa mai departe.

În primul rând, la primul pas, se construiește un dicționar din textul sursă, care conține cuvintele și pozițiile acestora în text. De asemenea, puteți număra frecvențele cuvintelor și expresiilor pentru a îmbunătăți calitatea rezultatelor căutării.

Se presupune că indexul, ca și dicționarul, este încărcat complet în memorie.

Caracteristicile tactice și tehnice ale dicționarului:

  • Text sursă - 8,2 gigaocteți de materiale din biblioteca Moshkov (lib.ru), 680 de milioane de cuvinte;
  • Dimensiunea dicționarului - 65 megaocteți;
  • Număr de cuvinte - 3,2 milioane;
  • Lungimea medie a cuvântului este de 9,5 caractere;
  • Lungimea medie pătrată a cuvântului (poate fi utilă la evaluarea unor algoritmi) - 10,0 caractere;
  • Alfabetul - majuscule A-Z, fara E (pentru a simplifica unele operatii). Cuvintele care conțin caractere non-alfabetice nu sunt incluse în dicționar.
Dependența dimensiunii dicționarului de volumul textului nu este strict liniară - până la un anumit volum, se formează un cadru de cuvânt de bază, variind de la 15% la 500 de mii de cuvinte până la 5% la 5 milioane, iar apoi dependența se apropie liniară , scăzând încet și ajungând la 0,5% la 680 de milioane de cuvinte. Menținerea ulterioară a creșterii este asigurată în cea mai mare parte de cuvinte rare.

Exemplu de algoritm de extindere

Acest algoritm este adesea folosit în sistemele de verificare ortografică (adică verificatoare ortografice), unde dimensiunea dicționarului este mică sau în care viteza nu este criteriul principal.
Se bazează pe reducerea problemei de căutare neclară la problema de căutare exactă.

Din interogarea inițială se construiește un set de cuvinte „eronate”, pentru fiecare dintre acestea fiind apoi efectuată o căutare exactă în dicționar.

Timpul său de rulare depinde foarte mult de numărul k de erori și de dimensiunea alfabetului A, iar în cazul utilizării unui dicționar binar, căutarea este:

De exemplu, când k = 1și cuvinte cu lungimea 7 (de exemplu, „Crocodil”) în alfabetul rus, setul de cuvinte eronate va avea o dimensiune de aproximativ 450, adică va fi necesar să se facă 450 de interogări de dicționar, ceea ce este destul de acceptabil.
Dar deja la k = 2 dimensiunea unui astfel de set va fi mai mare de 115 mii de opțiuni, ceea ce corespunde unei căutări complete a unui mic dicționar sau 1/27 în cazul nostru și, prin urmare, timpul de rulare va fi destul de mare. În același timp, nu trebuie uitat că pentru fiecare dintre aceste cuvinte este necesar să căutați o potrivire exactă în dicționar.

Particularitati:
Algoritmul poate fi ușor modificat pentru a genera variante „eronate” după reguli arbitrare și, în plus, nu necesită nicio prelucrare preliminară a dicționarului și, în consecință, memorie suplimentară.
Imbunatatiri posibile:
Este posibil să se genereze nu întregul set de cuvinte „eronate”, ci doar pe acelea dintre ele care sunt cel mai probabil să apară într-o situație reală, de exemplu, cuvinte ținând cont de greșelile comune de ortografie sau de dactilografiere.

Această metodă există de mult timp și este cea mai utilizată, deoarece implementarea ei este extrem de simplă și oferă performanțe destul de bune. Algoritmul se bazează pe principiul:
„Dacă cuvântul A se potrivește cu cuvântul B, având în vedere mai multe erori, atunci cu un grad ridicat de probabilitate vor avea cel puțin un subșir comun de lungime N.”
Aceste subșiruri de lungime N se numesc N-grame.
În timpul indexării, cuvântul este împărțit în astfel de N-grame, iar apoi acest cuvânt este inclus în listele pentru fiecare dintre aceste N-grame. În timpul căutării, interogarea este, de asemenea, împărțită în N-grame, iar pentru fiecare dintre ele se caută secvențial o listă de cuvinte care conțin un astfel de subșir.

Cele mai utilizate în practică sunt trigramele - subșiruri de lungime 3. Alegerea unei valori mai mari a lui N duce la o restricție a lungimii minime a cuvântului, la care detectarea erorilor este deja posibilă.

Particularitati:
Algoritmul N-gram nu găsește toate cuvintele posibile scrise greșit. Dacă luăm, de exemplu, cuvântul VOTKA și îl descompunem în trigrame: IN T KA → VO T DESPRE T LA T KA - puteți vedea că toate conțin eroarea T. Astfel, cuvântul „VODKA” nu va fi găsit, deoarece nu conține niciuna dintre aceste trigrame și nu va intra în listele corespunzătoare acestora. Astfel, cu cât lungimea unui cuvânt este mai mică și cu cât conține mai multe erori, cu atât este mai mare șansa ca acesta să nu se încadreze în listele corespunzătoare la N-grame ale interogării și să nu fie prezent în rezultat.

Între timp, metoda N-gram lasă spațiu complet pentru utilizarea propriilor valori cu proprietăți și complexitate arbitrare, dar trebuie să plătiți pentru asta - atunci când o utilizați, trebuie totuși să enumerați secvenţial aproximativ 15% din dicționar, ceea ce este destul de lot pentru dicționare mari.

Imbunatatiri posibile:
Este posibil să împărțiți tabelele hash de N-grame după lungimea cuvintelor și după poziția N-gramei în cuvânt (modificarea 1). Cum lungimea cuvântului căutat și a interogării nu poate diferi cu mai mult de k, iar pozițiile unui N-gram într-un cuvânt pot diferi cu cel mult k. Astfel, va fi necesar să se verifice doar tabelul corespunzător poziției acestui N-gram în cuvânt, precum și k tabele din stânga și k tabele din dreapta, i.e. Total 2k+1 mesele alăturate.

Puteți reduce și mai mult dimensiunea setului necesar pentru a scana împărțind tabelele după lungimea cuvintelor și, în mod similar, căutați numai prin tabelele învecinate. 2k+1 tabele (modificarea 2).

Acest algoritm este descris în articolul lui L.M. Boytsov. Hashing semnătură. Se bazează pe o reprezentare destul de evidentă a „structurii” unui cuvânt sub formă de biți, folosite ca hash (semnătură) într-un tabel hash.

În timpul indexării, astfel de hashuri sunt calculate pentru fiecare dintre cuvinte, iar corespondența listei de cuvinte din dicționar cu acest hash este introdusă în tabel. Apoi, în timpul căutării, un hash este calculat pentru interogare și toate hashurile învecinate care diferă de cel original cu cel mult k biți sunt sortate. Pentru fiecare dintre aceste hasheuri, se caută lista de cuvinte corespunzătoare.

Procesul de calculare a unui hash - fiecărui bit al hash-ului i se atribuie un grup de caractere din alfabet. Bit 1 pe poziție iîntr-un hash înseamnă că cuvântul original conține un caracter din i-a grupuri alfabetice. Ordinea literelor din cuvânt este absolut irelevantă.

Eliminarea unui caracter fie nu va modifica valoarea hash (dacă există încă caractere din același grup alfabetic în cuvânt), fie bitul corespunzător acestui grup se va schimba la 0. Când este inserat, în același mod, fie un bit va fie setat la 1, sau nu vor exista modificări. La înlocuirea caracterelor, totul este puțin mai complicat - hash-ul poate rămâne neschimbat deloc, fie se poate schimba în 1 sau 2 poziții. La permutare, nu apar deloc modificări, deoarece ordinea caracterelor la construirea unui hash, așa cum sa menționat mai devreme, nu este luată în considerare. Astfel, pentru a acoperi complet k erori, trebuie să schimbați cel puțin 2k pic în hash.

Timpul de rulare, în medie, cu k erori „incomplete” (inserții, ștergeri și transpuneri, precum și o mică parte din înlocuiri):

Particularitati:
Datorită faptului că la înlocuirea unui caracter, doi biți se pot schimba simultan, un algoritm care implementează, de exemplu, o distorsiune de cel mult 2 biți în același timp nu va produce de fapt întreaga cantitate de rezultate din cauza absenței o parte semnificativă (în funcție de raportul dintre dimensiunea hash și alfabet) a cuvintelor cu două înlocuiri (și cu cât dimensiunea hash este mai mare, cu atât mai des o înlocuire a caracterului va duce la distorsiunea a doi biți simultan și mai puțin completă rezultatul va fi). În plus, acest algoritm nu permite căutări de prefix.

copaci BK

Copaci Burkhard-Keller sunt arbori metrici, algoritmii pentru construirea unor astfel de arbori se bazează pe proprietatea metricii de a îndeplini inegalitatea triunghiului:

Această proprietate permite valorilor să formeze spații de metrică de dimensiune arbitrară. Astfel de spații metrice nu sunt neapărat euclidiană, deci, de exemplu, valorile LevenshteinȘi Damerau-Levenshtein formă non-euclidiană spaţiu. Pe baza acestor proprietăți, puteți construi o structură de date care caută într-un astfel de spațiu metric, care este arborii Barkhard-Keller.

Îmbunătățiri:
Puteți folosi capacitatea unor metrici de a calcula distanța cu o constrângere prin stabilirea unei limite superioare egală cu suma distanței maxime până la descendenții vârfului și distanța rezultată, ceea ce va accelera ușor procesul:

Testare

Testarea a fost efectuată pe un laptop cu Intel Core Duo T2500 (2GHz/667MHz FSB/2MB), 2Gb RAM, OS - Ubuntu 10.10 Desktop i686, JRE - OpenJDK 6 Update 20.

Testarea a fost efectuată folosind distanța Damerau-Levenshtein și numărul de erori k = 2. Mărimea indexului este specificată împreună cu dicționarul (65 MB).

Dimensiune index: 65 MB
Timp de căutare: 320ms / 330ms
Completitudinea rezultatelor: 100%

N-grame (original)
Dimensiune index: 170 MB
Timp de creare a indexului: 32 s
Timp de căutare: 71ms / 110ms
Completitudinea rezultatelor: 65%
N-grame (modificarea 1)
Dimensiune index: 170 MB
Timp de creare a indexului: 32 s
Timp de căutare: 39ms / 46ms
Completitudinea rezultatelor: 63%
N-grame (modificarea 2)
Dimensiune index: 170 MB
Timp de creare a indexului: 32 s
Timp de căutare: 37ms / 45ms
Completitudinea rezultatelor: 62%

Dimensiune index: 85 MB
Timp de creare a indexului: 0,6 s
Timp de căutare: 55 ms
Completitudinea rezultatelor: 56,5%

copaci BK
Dimensiune index: 150 MB
Timp de creare a indexului: 120 s
Timp de căutare: 540 ms
Completitudinea rezultatelor: 63%

Total

Majoritatea algoritmilor de căutare fuzzy indexați nu sunt cu adevărat subliniari (adică au un timp de rulare asimptotic O(log n) sau mai mică), iar viteza lor de funcționare depinde de obicei direct de N. Cu toate acestea, numeroase îmbunătățiri și perfecționări fac posibilă obținerea unui timp de rulare suficient de scurt chiar și cu volume foarte mari de dicționare.

Există, de asemenea, multe metode mai diverse și ineficiente bazate, printre altele, pe adaptarea diferitelor tehnici și tehnici deja utilizate în altă parte la un domeniu dat. Printre aceste metode se numără adaptarea arborilor de prefix (Trie) la problemele de căutare neclare, pe care le-am lăsat nesupravegheate din cauza eficienței sale scăzute. Dar există și algoritmi bazați pe abordări originale, de exemplu, algoritmul Maass-Novak, care, deși are un timp de rulare asimptotic subliniar, este extrem de ineficient datorită constantelor uriașe ascunse în spatele unei astfel de estimări de timp, care se manifestă sub forma unei mari dimensiuni de indice uriașă.

Utilizarea practică a algoritmilor de căutare fuzzy în motoarele de căutare reale este strâns legată de algoritmii fonetici, algoritmii de rădăcină lexicală - evidențiind partea de bază a diferitelor forme de cuvânt ale aceluiași cuvânt (de exemplu, o astfel de funcționalitate este oferită de Snowball și Yandex mystem), ca precum și clasarea pe baza informațiilor statistice sau folosind metrici sofisticate complexe.

  • Distanța Levenshtein (cu opțiune de tăiere și prefix);
  • Distanța Damerau-Levenshtein (cu opțiune de tăiere și prefix);
  • Algoritm Bitap (Shift-OR / Shift-AND cu modificări Wu-Manber);
  • Algoritm de extindere a probei;
  • Metoda N-gramelor (originală și cu modificări);
  • Metoda de hashing a semnăturii;
  • BK-copaci.
Am vrut să fac codul ușor de înțeles și, în același timp, suficient de eficient pentru utilizare practică. Stoarcerea ultimelor sucuri din JVM nu făcea parte din sarcinile mele. bucură-te.

Este demn de remarcat faptul că în procesul de studiu a acestui subiect, am venit cu unele dintre propriile mele dezvoltări care îmi permit să reduc timpul de căutare cu un ordin de mărime datorită creșterii moderate a dimensiunii indexului și a unor limitări în libertatea de alegere a metricilor. Dar asta este o cu totul altă poveste.


Definiție Exemplu de aplicații Crearea unui model de limbaj cu n-grame Calculul probabilității n-grame Eliminarea dispersității unui corpus de antrenament o Adăugarea unui corp de antrenament o Reducere Witten-Bell o Discounting Good-Turing o Katzs Backoff o Interpolare ștearsă Estimarea unui model de limbaj n-grame folosind entropie Conţinut


N-gramă (N-gramă engleză) o subsecvență de N elemente ale unei secvențe. Luați în considerare secvențele de cuvinte. Unigrame pisică, câine, cal,... Bigrame pisică, câine mare, cal puternic,... Trigrame pisică mănâncă, câine mare latră, aleargă puternic de cal,... Definiție


Exemple de sarcini aplicate Recunoașterea vorbirii. Unele cuvinte cu ortografie diferită sunt pronunțate la fel. Sarcina este de a alege cuvântul corect în context. Generarea de texte pe un subiect dat. Exemplu: Yandex.Rezumate. Căutați erori semantice. Încearcă să fineze - din punct de vedere al sintaxei, este adevărat, din punct de vedere al semanticii, nu. El încearcă să afle - corect. încercarea de a afla se găsește în textele în limba engleză mult mai des decât încercarea de a amenda, ceea ce înseamnă că dacă statisticile sunt disponibile, puteți găsi și elimina acest tip de eroare


Crearea unui model de limbaj de n-grame Pentru a rezolva problemele aplicate enumerate, este necesar să se creeze un model de limbaj de N-grame. Pentru a crea un model, trebuie să: 1. Calculați probabilitățile de n-grame în corpus de antrenament. 2. Remediați problema de dispersie a carcasei cu una dintre metodele de anti-aliasing. 3. Evaluați calitatea modelului de limbaj rezultat al n-gramelor folosind entropia.


Calcularea probabilității N-gramelor (1) În corpus de antrenament, anumite n-grame apar cu frecvențe diferite. Pentru fiecare n-gram, putem număra de câte ori apare în corpus. Pe baza datelor obținute, se poate construi un model probabilistic, care poate fi apoi utilizat pentru a estima probabilitatea de n-grame într-un corpus de testare.


Calcularea probabilității de N-grame (2) Luați în considerare un exemplu. Corpusul este format dintr-o singură propoziție: Au picnic la piscină, apoi s-au întins pe iarbă și s-au uitat la stele. Să selectăm n-grame. Unigrame: Ei, picknicked, de, … Digrame: They picniced, picknicked by, by the, … Trigrame They picknicked by, picknicked by the, by the pool, …


Calculul probabilității de N-grame (3) Acum este posibil să se numere n-grame. Toate bi- și trigramele selectate apar în corpus o dată. Toate unigramele, cu excepția cuvântului, apar și o dată. Cuvântul apare de trei ori. Acum că știm de câte ori apare fiecare n-gramă, putem construi un model probabilistic de n-grame. În cazul unigramelor, probabilitatea cuvântului u poate fi calculată folosind formula: De exemplu, pentru cuvânt probabilitatea va fi 3/16 (deoarece sunt 16 cuvinte în corpus, dintre care 3 sunt cuvântul the) . Numărul de apariții ale cuvântului u în corpus de antrenament Au picnic la piscină, apoi s-au întins pe iarbă și s-au uitat la stele


1, probabilitatea este considerată oarecum diferit. Luați în considerare cazul bigramelor: să fie necesar să se calculeze probabilitatea bigramelor din grup. Dacă considerăm fiecare cuvânt bigram ca un eveniment, atunci crezând" title="(!LANG:Calcul probabilității N-grame (4) Pentru n-grame, unde n>1, probabilitatea este calculată oarecum diferit. Luați în considerare cazul bigramelor : să fie necesar să se calculeze diagrama pool Dacă considerăm fiecare cuvânt al digramei ca un eveniment, atunci crezând" class="link_thumb"> 9 !} Calcularea probabilității de N-grame (4) Pentru n-grame, unde n>1, probabilitatea este calculată oarecum diferit. Luați în considerare cazul bigramelor: să fie necesar să se calculeze probabilitatea bigramelor din grup. Dacă considerăm fiecare cuvânt bigram ca un eveniment, atunci probabilitatea unui set de evenimente poate fi calculată prin formula: Astfel, probabilitatea bigramei este pool:, unde 1, probabilitatea este considerată oarecum diferit. Luați în considerare cazul bigramelor: să fie necesar să se calculeze probabilitatea bigramelor din grup. Dacă considerăm fiecare cuvânt bigram ca un eveniment, atunci crezând „> 1, probabilitatea este considerată oarecum diferit. Luați în considerare cazul bigramelor: să fie necesar să calculăm probabilitatea bigramei pool. Dacă considerăm fiecare cuvânt bigram ca fiind un eveniment, atunci probabilitatea unui set de evenimente poate fi calculată prin formula: Astfel, probabilitatea bigramei este pool:, unde "> 1, probabilitatea este calculată puțin diferit. Luați în considerare cazul bigramelor: să fie necesar să se calculeze probabilitatea bigramelor din grup. Dacă considerăm fiecare cuvânt bigram ca un eveniment, atunci crezând" title="(!LANG:Calcul probabilității N-grame (4) Pentru n-grame, unde n>1, probabilitatea este calculată oarecum diferit. Luați în considerare cazul bigramelor : să fie necesar să se calculeze diagrama pool Dacă considerăm fiecare cuvânt al digramei ca un eveniment, atunci crezând"> title="Calcularea probabilității de N-grame (4) Pentru n-grame, unde n>1, probabilitatea este calculată oarecum diferit. Luați în considerare cazul bigramelor: să fie necesar să se calculeze probabilitatea bigramelor din grup. Dacă considerăm fiecare cuvânt al digramei ca un eveniment, atunci a crede"> !}


Calculul probabilității N-gramelor (5) Acum luați în considerare calculul probabilității unui n-gram arbitrar (sau a unei propoziții de lungime n). Extindem cazul bigramelor, obținem formula probabilității pentru n-grame Astfel, calcularea probabilității unei propoziții se reduce la calcularea probabilității condiționate a N-gramelor care alcătuiesc această propoziție:




Eliminarea rarității corpusului (1) Problema unui model de limbaj simplu (nefinit) de n-grame: pentru unele n-grame, probabilitatea poate fi mult subestimată (sau chiar zero), deși în realitate (în corpus de testare) acestea n-gramele pot apărea destul de des. Motiv: corpus de instruire limitat și specificul acestuia. Soluție: prin scăderea probabilității unor n-grame, crește probabilitatea acelor n-grame care nu au apărut (sau au fost întâlnite destul de rar) în corpus de antrenament.




Eliminarea dispersității corpusului (3) Următoarele concepte sunt utilizate în algoritmii de eliminare a sparsității: Tipuri – diferite cuvinte (secvențe de cuvinte) în text. Jetoanele sunt toate cuvintele (secvențele de cuvinte) din text. Au făcut picnic lângă piscină, apoi s-au întins pe iarbă și s-au uitat la stele - 14 tipuri, 16 jetoane





Adăugați-o netezire (4) Metoda provoacă o eroare puternică în calcule (de exemplu, în diapozitivul anterior s-a arătat că pentru cuvântul chineză numărul de bigrame a fost redus de 8 ori). Testele au arătat că modelul nenetezit arată adesea rezultate mai precise. Prin urmare, metoda este interesantă doar din punct de vedere teoretic.


Discounting Witten-Bell (1) Pe baza unei idei simple: utilizați datele despre n-grame care apar în corpus de antrenament pentru a estima probabilitatea lipsei n-gramelor. Ideea metodei este preluată din algoritmii de compresie: sunt luate în considerare două tipuri de evenimente - au întâlnit un nou caracter (tip) și au întâlnit un caracter (token). Formula de probabilitate pentru toate n-gramele lipsă (adică probabilitatea de a întâlni o n-gramă în corpusul de testare care nu a fost în corpusul de antrenament): N este numărul de jetoane din corpusul de antrenament, T este numărul de tipuri care au fost deja întâlnite în corpus de instruire






Reducere Witten-Bell (4) =>=> =>"> =>"> =>" title="(!LANG:Reducere Witten-Bell (4) =>=>"> title="Reducere Witten-Bell (4) =>=>"> !}




Good-Turing Discounting (1) Idee: Pentru n-grame care apar de zero ori (c ori), scorul este proporțional cu numărul de n-grame care apar o dată (c + 1 ori). Luați în considerare un exemplu: Să presupunem că au fost prinși 18 pești. În total, au fost capturate 6 specii diferite, iar un singur reprezentant a fost prins la trei specii. Trebuie să găsim probabilitatea ca următorul pește să aparțină unei specii noi. Există 7 specii posibile în total (6 specii au fost deja prinse).








Katzs Backoff (2) Coeficientul α este necesar pentru distribuția corectă a probabilității reziduale a N-grame în conformitate cu distribuția de probabilitate a (N-1)-grame. Dacă nu introduceți α, estimarea va fi eronată, deoarece egalitatea nu va fi îndeplinită: Calculul lui α este dat la sfârșitul raportului. Evaluarea unui model de limbaj folosind entropia (1) Entropia este o măsură a incertitudinii. Cu ajutorul entropiei, se poate determina cel mai potrivit model de limbaj de N-grame pentru o anumită sarcină aplicată. Formula de entropie binară: Exemplu: Calculați entropia unui test de aruncare a monedelor. Răspuns: 1 bit, cu condiția ca rezultatele experimentului să fie la fel de probabile (orice parte va cădea cu o probabilitate de 1/2).




Evaluarea modelului de limbaj folosind entropia (3) Entropia încrucișată este utilizată pentru a compara diferite modele de limbaj: Cu cât valoarea entropiei încrucișate H(p,m) este mai aproape de entropia reală H(p), cu atât este mai bine modelul de limbaj: În cazul nostru, H(p ) este entropia corpusului de testare. m(w) – model de limbă (de exemplu, model N-gram)


Evaluarea unui model de limbaj folosind entropia (4) Există o altă metodă de evaluare a calității unui model de limbaj, bazată pe așa-numitul. indicator de conectivitate (perplexitate). Idee: Calculați probabilitatea întregului corpus de testare. Un model mai bun va arăta o probabilitate mai mare. formula de perplexitate: Astfel, cu cât perplexitatea este mai mică, cu atât modelul este mai bun. Perplexitatea poate fi interpretată ca numărul mediu de cuvinte care pot veni după un anumit cuvânt (adică cu cât este mai multă perplexitate, cu atât este mai mare ambiguitatea și, prin urmare, cu atât modelul de limbaj este mai rău). Relația dintre perplexitate și entropia binară:


Estimarea unui model de limbaj folosind entropia (5) De exemplu, luați în considerare valorile perplexității pentru un anumit corpus, obținute folosind modele antrenate de unigrame, bigrame și trigrame: În cazul trigramelor, perplexitatea este cea mai mică, deoarece dezambiguizarea este facilitată de cea mai lungă lungime a istoricului dintre toate modelele (egale cu 2) atunci când se calculează probabilitățile condiționate ale trigramelor. UnigramăBigramăTrigramă Perplexitate


Vreau să implementez niște aplicații n-gram (de preferință în PHP).

Ce tip de n-grame este mai potrivit pentru majoritatea scopurilor? Nivelul cuvântului sau nivelul caracterului Nivelul n-gramelor? Cum poate fi implementat un tokenizer n-gramatical în PHP?

În primul rând, aș dori să știu ce sunt N-gramele. E corect? Așa înțeleg n-gramele:

Sugestie: „Locuiesc în New York”.

biram la nivel de cuvânt (2 pentru n): „# I”, „Locuiesc”, „locuiesc în”, „în New York”, „NY #”

biram la nivel de caracter (2 pentru n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", „n#”, „#N”, „NY”, „Y#”

Odată ce aveți această matrice de părți n-grame, adăugați duplicate și adăugați un contor pentru fiecare parte care specifică frecvența:

bigrame la nivel de cuvânt:

bigrame la nivel de caracter:

Este corect?

De asemenea, aș dori să știu mai multe despre ce puteți face cu n-grame:

  • Cum pot detecta limba unui text folosind n-grame?
  • Este posibil să faceți traducere automată folosind n-grame chiar dacă nu aveți un corpus bilingv?
  • Cum se creează un filtru de spam (spam, ham)? Combinați n-grame cu filtru bayesian?
  • Cum pot găsi un subiect? De exemplu: există un text despre baschet sau câini? Abordarea mea (faceți următoarele cu articolul Wikipedia pentru „câini” și „baschet”): reprezentați vectorii n-grame pentru ambele documente, normalizați-i, calculați distanța Manhattan/Euclid, cu cât rezultatul este mai aproape de 1, cu atât mai mare. asemănarea va fi

Ce părere aveți despre cererea mea, în special despre ultima?

Sper că mă poți ajuta. Mulțumesc anticipat!

2 raspunsuri

Cuvântul n-gramă va fi, în general, mai util pentru majoritatea aplicațiilor de analiză de text pe care le-ați menționat, cu posibila excepție a definiției limbii, unde ceva de genul trigramelor de caractere ar putea da rezultate mai bune. În mod efectiv, ați crea un vector de n-grame pentru corpul textului în fiecare limbă care vă interesează, apoi veți compara frecvențele trigramelor din fiecare corpus cu cele din documentul pe care îl clasificați. De exemplu, trigrama the este probabil să apară mult mai frecvent în engleză decât în ​​germană și ar oferi un anumit nivel de corelație statistică. Odată ce aveți documente n-gram, aveți de ales între mulți algoritmi pentru analize ulterioare, filtre Baysian, N Nearest Neighbor, Support Vector Machines etc.

Dintre aplicațiile pe care le-ați menționat, traducerea automată este probabil cea mai exagerată, deoarece numai n-gramele nu vă vor duce foarte departe pe drum. Convertirea unui fișier de intrare în reprezentare n-gram este doar o modalitate de a pune datele într-un format pentru o analiză ulterioară a caracteristicilor, dar pe măsură ce pierdeți o mulțime de informații contextuale, s-ar putea să nu fie utilă pentru traducere.

Un lucru de remarcat este că nu este suficient să creați un vector pentru un document și un vector pentru un alt document dacă dimensiunile nu se potrivesc. Adică prima intrare în vector nu poate fi într-un document și este într-altul, sau algoritmii nu vor funcționa. Veți ajunge cu vectori precum , deoarece majoritatea documentelor nu vor conține mai mult decât n-gramele care vă interesează. Această „căptușeală” necesită, de asemenea, să determinați dinainte ce ngrame veți include în analiză. Adesea, acesta este implementat ca un algoritm cu două treceri pentru a decide mai întâi semnificația statistică a diferitelor n-grame pentru a decide ce să păstreze. Google „selecție de funcții” pentru mai multe informații.

N-gramele bazate pe cuvinte plus suportul pentru mașinile vectoriale este o modalitate excelentă de a defini un subiect, dar pentru a pregăti un clasificator aveți nevoie de un corp mare de text preclasificat în subiecte „pe subiect” și „în afara subiectului”. Veți găsi un număr mare de lucrări de cercetare care explică diferite abordări ale acestei probleme pe un site precum citeseerx. Nu aș recomanda abordarea distanței euclidiene a acestei probleme, deoarece nu ponderează n-gramele individuale pe baza semnificației statistice, așa că două documente care includ , a , is și of ar fi considerate o potrivire mai bună decât două documente , care includea Baysian. Eliminarea cuvintelor stop din n-gramele dvs. de interes ar îmbunătăți puțin acest lucru.

Ai dreptate în privința definiției n-gramelor.

Puteți utiliza n-grame la nivel de cuvânt pentru aplicații de tip de căutare. N-gramele la nivel de caractere pot fi folosite mai mult pentru a analiza textul în sine. De exemplu, pentru a identifica limba unui text, aș folosi frecvențele de litere față de frecvențele de limbă stabilite. Adică, textul ar trebui să corespundă aproximativ cu frecvența de apariție a literelor în această limbă.

Tokenizerul n-gramatical pentru cuvinte în PHP poate fi realizat folosind strtok:

Pentru caractere, utilizați split:

Apoi puteți împărți matricea după cum doriți în orice număr de n-grame.

Filtrele bayesiene trebuie antrenate pentru a fi utilizate ca filtre de spam care pot fi utilizate împreună cu n-grame. Cu toate acestea, trebuie să-i oferi multă contribuție pentru a-l menține să învețe.

Ultima ta abordare sună decent pe măsură ce învață contextul paginii... este încă destul de dificil de făcut, totuși, dar n-gramele par un bun punct de plecare pentru asta.