N-gramm. Sisemise optimeerimise täiustamine konkurentide abiga Vaata, mis on “N-gramm” teistes sõnaraamatutes

N-grammi kasutamine

N-grammi üldine kasutamine

  • andmete eraldamine, et koondada kosmosest Maa satelliidipiltide seeria, et seejärel otsustada, millised konkreetsed Maa osad on pildil,
  • otsida geneetilisi järjestusi,
  • geneetika valdkonnas kasutatakse määramaks, millistelt konkreetsetelt loomaliikidelt DNA-proove kogutakse,
  • arvuti tihendamisel,
  • N-grammi kasutades indekseeritakse tavaliselt heliga seotud andmed.

N-gramme kasutatakse laialdaselt ka loomuliku keele töötlemisel.

N-grammi kasutamine loomuliku keele töötlemise vajadusteks

Loomuliku keele töötlemise vallas kasutatakse N-gramme eeskätt tõenäosusmudelitel põhinevaks ennustamiseks. N-grammi mudel arvutab N-grammi viimase sõna tõenäosuse, kui kõik eelnevad on teada. Kasutades seda mudelikeele lähenemist, eeldatakse, et iga sõna esinemine sõltub ainult eelmistest sõnadest.

Teine N-grammi rakendus on plagiaadi tuvastamine. Kui jagate teksti mitmeks väikeseks fragmendiks, mida tähistavad n-grammid, saab neid hõlpsasti üksteisega võrrelda ja seeläbi saada kontrollitavate dokumentide sarnasusaste. N-gramme kasutatakse sageli edukalt teksti ja keele kategoriseerimiseks. Lisaks saab nende abil luua funktsioone, mis võimaldavad tekstiandmetest teadmisi hankida. N-gramme kasutades saate tõhusalt leida kandidaate valesti kirjutatud sõnade asendamiseks.

Google'i uurimisprojektid

Google'i uurimiskeskused on kasutanud N-grammi mudeleid laias valikus uurimis- ja arendustegevuses. Nende hulka kuuluvad sellised projektid nagu statistiline tõlkimine ühest keelest teise, kõnetuvastus, õigekirja parandamine, teabe hankimine ja palju muud. Nende projektide jaoks kasutati mitut triljonit sõna sisaldavaid tekstikorpusi.

Google otsustas luua oma õppehoone. Projekt kannab nime Google teracorpus ja see sisaldab 1 024 908 267 229 sõna, mis on kogutud avalikelt veebisaitidelt.

N-grammi eraldamise meetodid

Kuna N-gramme kasutatakse sageli erinevate probleemide lahendamisel, on nende tekstist väljavõtmiseks vaja usaldusväärset ja kiiret algoritmi. Sobiv n-grammi ekstraktimise tööriist peaks suutma hakkama saada piiramatu suurusega tekstiga, olema kiire ja kasutama tõhusalt olemasolevaid ressursse. Tekstist N-grammi eraldamiseks on mitu meetodit. Need meetodid põhinevad erinevatel põhimõtetel:

Märkmed

Vaata ka


Wikimedia sihtasutus.

  • 2010. aasta.
  • n-tv

N-kadheriin

    Vaadake, mis on "N-gramm" teistes sõnaraamatutes: GRAM - (prantsuse gramme, kreeka keele gramma tunnusest). Prantsuse keele ühik kaal = 1 kuupsentimeetri destilleeritud vee kaal = 22,5 vene. aktsiad Sõnastik võõrsõnad , sisaldub vene keeles. Chudinov A.N., 1910. GRAM-i kaalu mõõtühik Prantsusmaal ...

    Vene keele võõrsõnade sõnastik grammi - gramm, gen. pl. grammid ja aktsepteeritavad (suulises kõnes numbrite järel) grammid. Sada grammi (grammi). Kaitses uus vorm perekond. mitmuse juhtum grammide arvu rääkis vene keele asjatundja, kirjanik K. Tšukovski. Nii kirjutas ta raamatus "Elus nagu elu": ... ...

    Vaadake, mis on "N-gramm" teistes sõnaraamatutes: Kaasaegse vene keele hääldusraskuste ja rõhu sõnastik - GRAM, gramm, abikaasa. (kreeka keelest gramma märk, täht). Põhiline kaaluühik meetermõõdustikus, mis võrdub 1 kuupsentimeetri vee massiga. Üks gramm kaalub umbes 1/400 naela. ❖ Grami aatom (füüsikaline) aine grammide arv, mis võrdub selle aatommassiga.... ... Sõnastik

    Ušakova gramm-röntgen - gramm roentgen/n, gramm roentgen/na, gen. pl. grammröntgen ja grammröntgen...

    Vene keele võõrsõnade sõnastik Koos. Eraldi. Sidekriipsuga. - Gram, seda lihtsat sõna poleks saanud vigade sõnaraamatusse lisada, kui mitte kahel juhul; esiteks, kui tahad eputada absoluutselt õige keelekasutusega, siis poodi tulles uimasta müüja õigega: Kaalu mulle kakssada grammi (mitte... ...

    Vene keele vigade sõnastik GRAM-ATOM - GRAM ATOM, elemendi kogus, mille mass grammides võrdub selle ATOMMASSIGA. See asendati SI-ühiku mooliga. Näiteks üks gramm vesinikuaatomit (H, aatommass = 1) võrdub ühe grammiga. b>GRAMIMIEKVIVALENT, selle kaal grammides... ...

    Vaadake, mis on "N-gramm" teistes sõnaraamatutes: Teaduslik ja tehniline entsüklopeediline sõnastik - GRAM, oh, lahke. pl. grammi ja grammi, abikaasa Massi ühik sisse kümnendsüsteem mõõdud, üks tuhandik kilogrammi. Mitte grammigi (ei) millestki (kõnekeelest) üldse mitte, üldse mitte. Sellel mehel (pole) südametunnistust. | adj. gramm, oh, oh. Arukas......

    Vene keele võõrsõnade sõnastik- A; pl. perekond. grammid ja grammid; m [prantsuse] gramme] Massiühik meetermõõdustikus, üks tuhandik kilogrammi. ◊ Mitte (ainsatki) grammi. Üldse mitte, üldse mitte. Kelles l. mitte untsugi valet. Kellelgi pole südametunnistust. * * * grammi (prantsuse ... Entsüklopeediline sõnaraamat

    Vanaema Zenob Théophile- (Gramme) (1826 1901), elektriinsener. Sündis Belgias, töötas Prantsusmaal. Sai patendi praktiliselt kasutatavale elektrigeneraator rõngaankruga (1869). Asutas elektrimasinate tööstusliku tootmise. * * * GRAM Zenob ... ... Entsüklopeediline sõnaraamat

    gramm-aatom- aine kogus grammides, mis on arvuliselt võrdne selle aatommassiga. Terminit ei soovitata kasutada. SI-s väljendatakse aine kogust moolides. * * * GRAM ATOM GRAM ATOM, aine kogus grammides, arvuliselt võrdne selle aatommassiga (cm ... Entsüklopeediline sõnaraamat

    grammi molekul- aine kogus grammides, mis on arvuliselt võrdne selle molekulmassiga. Terminit ei soovitata kasutada. SI-s väljendatakse aine kogust moolides. * * * GRAMMI MOLEKULL GRAMIMOLEKUL, aine kogus grammides, arvuliselt võrdne selle ... ... Entsüklopeediline sõnaraamat

Semantiline tuum

Veebilehe edukaks arendamiseks ja nähtavuse suurendamiseks kaasaegses reaalsuses on vaja pidevalt laieneda semantiline tuum. Üks neist parimad viisid pikendamine on tasuline märksõnad konkurendid.

Tänapäeval pole konkurentide semantika hankimine keeruline, sest Seal on palju teenuseid, nii tasulisi kui ka tasuta.

Tasuta loend:

- megaindex.ru - "Saidi nähtavuse" tööriist

— xtool.ru — tuntud teenus, mis näitab ka märksõnu, mille järgi sait on järjestatud

Tasuliste nimekiri:

— spywords.ru — sobib Yandexi ja Google'i jaoks

- semrush.ru - orienteeritud ainult Google'ile

— prodvigator.ua — spywords.ru ukraina analoog

Lisaks teenustele saate kasutada käsitsi meetod, mis põhineb pealkirja ja kirjelduse jagamisel n-grammideks, mille tulemuseks on väljundina täiendav fraaside loend.

N-gramm - n elemendi jada. Praktikas leidub N-grammi sagedamini sõnade jadana. Sageli nimetatakse kahe järjestikuse elemendi jada suurgramm, nimetatakse kolmest elemendist koosnevat jada trigramm. Vähemalt neli või enam elementi on tähistatud N-grammina, N asendatakse järjestikuste elementide arvuga.

Mõelgem seda tehnikat samm-sammult:

— Laadime maha võistlejate pealkirjad (kirjeldused). Seda saab teha Screaming Frog SEO programmi abil.

— Tekstiredaktoris puhastame saadud loendi kõne abiosadest, kirjavahemärkidest ja muust prügist. Kasutan ülevas tekstiredaktoris otsingu ja asendamise funktsiooni ( kiirklahv ctrl+H), kasutades regulaaravaldisi:

— Valige soovitud n-gramm ja määrake sageduseks vähemalt üks. Enamik parim variant- need on trigrammid ja 4-grammised:

— Saame järgmise tulemuse:

Veergloendamanäitab korduste arvun-gramm, veergsagedus - sagedusn- grammi.

Pärast fraaside loendi saamist peame seda analüüsima ja semantilise tuuma laiendamiseks valima sobivad märksõnad. Lisateavet saate meie ajaveebi vastavast jaotisest.

Taotluste rühmitamine

On väga oluline mõista, kuidas konkurentide semantiline tuum on rühmitatud, sest see aitab võtmefraase saidi lehtedel õigesti levitada.

Selleks peame pärast täieliku päringute loendi loomist hankima asjakohased lehed ja konkurentide positsioonid (saate kasutada teenust seolib.ru) ning seejärel võrrelda neid oma grupeeringuga. Kui on selge, et konkurendil on hea positsioon ja samas erineb tema rühmitus meie omast (näiteks on konkurendi taotlused laiali jaotatud erinevad lehed, ja meil on samad taotlused), peate sellele tähelepanu pöörama ja oma veebisaidi sihtlehed üle vaatama.

Vaatame väikest näidet tingimusliku saidi ja selle konkurendi rühmitamise võrdlemisest.

Nagu tabelist näha, valiti üks veebisaidilt site.ru sihtleht kõigi märksõnade jaoks. Võistleja järjestab samade päringute jaoks erinevaid lehti ja võtab TOP või TOPi lähedale. Selle põhjal võime järeldada, et saidi site.ru rühmitus tuleb üle vaadata, eelkõige on vaja luua eraldi leht võtmefraasid sõnaga "fassaad".

Tekstide kvaliteet

Esimene ja kõige olulisem asi, millele konkurentide tekste analüüsides tähelepanu pöörata, ei ole mitte kvantitatiivne komponent (esinemiste arv, teksti maht jne), vaid kvalitatiivne või semantiline – kui kasulik on info, milline on konkurent. pakub ja kuidas ta seda teeb.

Vaatame mõnda näidet.

Oletame, et toimetate lilled ja avaleht tekstis garanteerite nende värskuse. Näiteks nii:

Lillede kohaletoimetamise teenussaidile. rugaranteerib kimpude ohutuse ka külmal aastaajal.

Siin on näide ühelt meie konkurendilt:

Meilt on kasulik tellida lõhnavaid kompositsioone, sest lillede värskuses kahtluse korral garanteerime 100% raha tagasi.

Konkurendi garantii on tagatud rahaga, mis on olulisem kui abstraktne garantii.

Vaatame veel ühte näidet - veebipoe kategooria "keraamilised plaadid" lehel olevat teksti:

See tekst ei kanna kasulikku semantilist koormust, see on puhas vesi. Tõenäoliselt soovib inimene, kes tuleb lehele ja teeb ostuotsuse, teada toote eeliseid ja võimalikke konfiguratsioone, kuid selle asemel saab ta mõttetu tähemärkide komplekti.

Vaatame nüüd konkurendi teksti:

See tekst on kasulikum, sest... Ütleb lühidalt plaatide erinevused ja aitab teil mõista, kuidas õiget valida.

Seega võite konkurentide tekste enda omadega võrreldes palju võita kasulikku teavet, mis aitab copywritereid tehniliste kirjelduste koostamisel.

Tekstide asjakohasus

Tekstikvaliteedi teemat jätkates ei saa jätta puudutamata nende asjakohasust. Tänapäeval, et tekst oleks asjakohane, ei piisa ainult märksõnade kaasamisest. Lehe asjakohasuse suurendamiseks ilma teksti rämpsposti muutmata peate kasutama teemaga seotud sõnu.

Hinnates teksti asjakohasust päringule, analüüsib otsingumootor mitte ainult märksõnade olemasolu, vaid ka lisasõnu, määrates nii teksti tähenduse. Näiteks kui kirjutame teksti elevandi kohta, siis võib käsitleda seotud sõnu: "tüvi", "kihvad", "loodus", "loomaaed". Kui tekst räägib malenupist “piiskop”, siis on need sõnad: “nupp”, “tšekk”, “kuninganna” jne.

Konkurentide tekstidest saate oma päringute jaoks sobivaima sõnade loendi. Selleks peate tegema järgmised sammud:

— Kopeerime kõik TOP-10 tekstid vastavalt soovitud HF-päringule erinevatesse tekstifailidesse.

— Eemaldame tekstidest ametlikud kõneosad, kirjavahemärgid ja numbrid (räägiti varem).

— Sõnade järjestamine stringiks — funktsiooni „otsi ja asenda” kasutamine regulaaravaldistega. Asendage tühik tähega \n.

- Järgmiseks on vaja viia kõik sõnavormid tavasõnastikuvormi (leme). Selleks saate kasutada teenust https://tools.k50project.ru/lemma/. Väljale tuleb igast failist eraldi sisestada sõnade loend ja klõpsata nupul “lemmetiseeri ja väljasta csv-tabelina”. Tulemuseks peaks olema 10 faili lemmetiseeritud sõnadega.

— Eemaldame igast failist dubleerivad sõnad.

— Kombineerime failidest pärit sõnad ühte loendisse.

— Nüüd peame looma sagedussõnastiku. Selleks lisage saadud loend teenusesse https://tools.k50project.ru/lemma/ ja klõpsake nuppu "Ehita sagedussõnastik CSV-vormingus".

— Meie sõnade nimekiri on valmis:

Kui sagedus on 10, siis kasutati seda sõna kõigil 10 saidil, kui 8, siis ainult 8 jne. Soovitame kasutada levinumaid sõnu, kuid huvitavaid lahendusi võib leida ka harvaesinevate sõnade hulgast.

nagu see lihtsal viisil saate temaatiliste sõnade loendi copywriterite tehniliste kirjelduste koostamiseks.

Nagu näete, on konkurendid väga oluline teabeallikas, mis aitab teil saite paremini optimeerida. Selles artiklis ei ole ma kõiki aspekte käsitlenud ja edaspidi kirjutan jätkuvalt sellest, mis on kasulik ja kuidas saate oma konkurentidelt õppida.

Liituge meie uudiskirjaga Need algoritmid on loodud otsima varem tundmatu teksti vahel ja neid saab kasutada näiteks sisse tekstiredaktorid, dokumendivaaturid või veebibrauserid, et lehelt otsida. Nad ei nõua eeltöötlus teksti ja saab töötada pideva andmevooga.

Lineaarne otsing

Lihtne järjepidev rakendamine etteantud mõõdik (näiteks Levenshteini mõõdik) sisendteksti sõnadele. Piiratud mõõdiku kasutamisel võimaldab see meetod optimaalset jõudlust. Kuid samal ajal, seda rohkem k, seda rohkem tööaeg pikeneb. Asümptootiline ajaprognoos - O (kn).

Bitap (tuntud ka kui Shift-Or või Baeza-Yates-Gonnet ja selle modifikatsioon Wu-Manberi poolt)

Algoritm Bitap ja selle erinevaid modifikatsioone kasutatakse kõige sagedamini uduseks otsinguks ilma indekseerimiseta. Selle variatsiooni kasutatakse näiteks Unixi utiliidis agrep, mis täidab tavapärase grepiga sarnaseid funktsioone, kuid veatoega otsingupäring ja isegi pakkudes regulaaravaldiste kasutamiseks piiratud võimalusi.

Selle algoritmi idee pakkusid esmakordselt välja kodanikud Ricardo Baeza-Yates Ja Gaston Gonnet, avaldades sellega seotud artikli 1992. aastal.
Algoritmi algversioon tegeleb ainult märkide asendustega ja tegelikult arvutab kauguse Hemming. Aga veidi hiljem Päike Wu Ja Udi Manber pakkus välja selle algoritmi muutmise kauguse arvutamiseks Levenštein, st. võttis kasutusele lisamiste ja kustutamiste toe ning töötas selle põhjal välja utiliidi agrep esimese versiooni.






Tulemuslik väärtus

Kus k- vigade arv, j- sümbolite indeks, s x - märgimask (maskis asuvad ühikubitid positsioonidel, mis vastavad selle märgi positsioonidele päringus).
Selle, kas päring on sobitatud või mitte, määrab saadud vektori R viimane bitt.

Selle algoritmi suure kiiruse tagab arvutuste bitiparalleelsus – ühe operatsiooniga on võimalik teha arvutusi 32 või enama biti pealt korraga.
Samal ajal toetab triviaalne teostus sõnade otsimist, mille pikkus ei ületa 32. Selle piirangu määrab standardtüübi laius int(32-bitistel arhitektuuridel). Võib kasutada ka suuremate mõõtmetega tüüpe, kuid see võib algoritmi teatud määral aeglustada.

Vaatamata sellele, et selle algoritmi asümptootiline tööaeg O (kn) langeb kokku sellega lineaarne meetod, on see pikkade päringute ja vigade arvuga oluliselt kiirem k rohkem kui 2.

Testimine

Testimine viidi läbi 3,2 miljoni sõna pikkuse tekstiga, keskmine sõna pikkus oli 10.
Täpne otsing
Otsinguaeg: 3562 ms
Otsige Levenshteini mõõdiku abil
Otsimise aeg kl k = 2: 5728 ms
Otsimise aeg kl k = 5: 8385 ms
Otsige Wu-Manberi modifikatsioonidega Bitap-algoritmi abil
Otsimise aeg kl k = 2: 5499 ms
Otsimise aeg kl k = 5: 5928 ms

On ilmne, et erinevalt Bitap-algoritmist sõltub lihtne otsing mõõdikute abil suuresti vigade arvust k.

Kui aga tegemist on suurte muutumatute tekstide otsimisega, saab otsinguaega oluliselt vähendada sellise teksti eeltöötlemisega, ka nn. indekseerimine.

Hägusad otsingualgoritmid koos indekseerimisega (võrguühenduseta)

Kõigi indekseerimisega hägusate otsingualgoritmide tunnuseks on see, et indeks koostatakse lähtetekstist koostatud sõnastikust või andmebaasi kirjete loendist.

Need algoritmid kasutavad probleemi lahendamisel erinevaid lähenemisviise – mõned neist kasutavad taandamist täpseks otsinguks, teised kasutavad mõõdiku omadusi erinevate ruumiliste struktuuride konstrueerimiseks jne.

Kõigepealt koostatakse lähtetekstist esimeses etapis sõnastik, mis sisaldab sõnu ja nende asukohti tekstis. Otsingutulemuste kvaliteedi parandamiseks saate lugeda ka sõnade ja fraaside sagedusi.

Eeldatakse, et indeks, nagu ka sõnastik, on täielikult mällu laaditud.

Sõnastiku taktikalised ja tehnilised omadused:

  • Lähtetekst - 8,2 gigabaiti materjale Moshkovi raamatukogust (lib.ru), 680 miljonit sõna;
  • Sõnastiku suurus - 65 megabaiti;
  • Sõnade arv - 3,2 miljonit;
  • Sõna keskmine pikkus on 9,5 tähemärki;
  • Keskmine ruutsõna pikkus (võib olla kasulik mõne algoritmi hindamisel) - 10,0 tähemärki;
  • Tähestik – suurtähed tähed A-Z, ilma Eta (mõnede toimingute lihtsustamiseks). Sõnad, mis sisaldavad mittetähestikulisi märke, ei sisaldu sõnastikus.
Sõnastiku suuruse sõltuvus tekstimahust ei ole rangelt lineaarne – teatud mahuni moodustub sõnade põhiraamistik, mis ulatub 15%-st 500 tuhande sõna puhul 5%-ni 5 miljoni sõna puhul ja seejärel sõltuvus läheneb lineaarsele, väheneb aeglaselt ja ulatub 0,5%-ni 680 miljoni sõna puhul Hilisem kasvu säilitamine on tagatud enamasti haruldaste sõnade kaudu.

Valimi laiendamise algoritm

Seda algoritmi kasutatakse sageli õigekirjakontrollisüsteemides (st õigekirjakontrollides), kus sõnastiku maht on väike või kiirus ei ole peamine kriteerium.
See põhineb ähmase otsingu probleemi taandamisel täpseks otsinguprobleemiks.

Algsest päringust konstrueeritakse komplekt "vigaseid" sõnu, millest igaühe jaoks tehakse sõnastikust täpne otsing.

Selle tööaeg sõltub tugevalt vigade arvust k ja tähestiku A suurusest ning binaarsõnastikuotsingu kasutamisel on see:

Näiteks millal k = 1 ja sõnad pikkusega 7 (näiteks “krokodill”) vene tähestikus on paljud ekslikud sõnad umbes 450 suurused, see tähendab, et sõnaraamatusse on vaja teha 450 päringut, mis on üsna vastuvõetav.
Aga juba kl k = 2 sellise komplekti suurus on üle 115 tuhande valiku, mis vastab väikese sõnaraamatu täielikule otsingule ehk meie puhul 1/27 ja seetõttu on tööaeg üsna pikk. Samal ajal ei tohi me unustada, et iga nende sõnade jaoks on vaja sõnastikust otsida täpset vastet.

Iseärasused:
Algoritmi saab hõlpsasti muuta, et genereerida suvaliste reeglite järgi "vigaseid" valikuid ja pealegi ei nõua see sõnastiku eeltöötlust ja vastavalt täiendavat mälu.
Võimalikud parandused:
Ei ole võimalik genereerida tervet komplekti "vigaseid" sõnu, vaid ainult neid, mis reaalses olukorras kõige tõenäolisemalt esinevad, näiteks sõnad, mis võtavad arvesse tavalisi õigekirjavigu või trükivigu.

See meetod leiutati üsna kaua aega tagasi ja on kõige laialdasemalt kasutatav, kuna selle rakendamine on äärmiselt lihtne ja annab üsna head jõudlust. Algoritm põhineb järgmisel põhimõttel:
"Kui sõna A vastab sõnale B, võttes arvesse mitmeid vigu, on neil suure tõenäosusega vähemalt üks ühine alamstring pikkusega N."
Neid alamstringe pikkusega N nimetatakse N-grammideks.
Indekseerimise käigus jagatakse sõna nendeks N-grammideks ja seejärel lisatakse sõna iga N-grammi loendisse. Otsingu käigus jagatakse päring ka N-grammideks ning igaühe kohta otsitakse järjestikku sellist alamstringi sisaldavate sõnade loendit.

Praktikas kasutatakse kõige sagedamini trigramme – alamstringe pikkusega 3. Suurema N väärtuse valimine toob kaasa piirangu sõna minimaalsele pikkusele, mille juures vigu saab juba tuvastada.

Iseärasused:
N-grammi algoritm ei leia kõike võimalikud sõnad vigadega. Kui võtame näiteks sõna VOTKA ja lagundame selle trigrammideks: VO T KA → VO T KOHTA T TO T KA - võite märgata, et need kõik sisaldavad viga T. Seega sõna "VODKA" ei leita, kuna see ei sisalda ühtegi neist trigrammidest ja seda ei lisata vastavatesse loenditesse. Seega, mida lühem on sõna pikkus ja rohkem vigu see sisaldab, seda suurem on võimalus, et see ei satu päringu N-grammidele vastavatesse loenditesse ega esine ka tulemuses.

Samal ajal jätab N-grammi meetod täieliku võimaluse kasutada oma suvaliste omaduste ja keerukusega mõõdikuid, kuid selle eest tuleb maksta – selle kasutamisel tuleb siiski järjestikku otsida umbes 15% sõnastikust, mis on üsna suur hulk. palju suurte sõnaraamatute jaoks.

Võimalikud parandused:
N-grammi räsitabeleid saab jagada sõna pikkuse ja N-grammi positsiooni järgi sõnas (muudatus 1). Kuidas otsingusõna ja päringu pikkus ei tohi erineda rohkem kui k, ja N-grammi asukohad sõnas võivad erineda mitte rohkem kui k võrra. Seega on vaja kontrollida ainult tabelit, mis vastab selle N-grammi asukohale sõnas, samuti k tabelit vasakul ja k tabelit paremal, st. kokku 2k+1 naaberlauad.

Saate vaatamiseks vajaliku hulga suurust veelgi vähendada, jagades tabelid sõna pikkuse järgi ja samamoodi vaadates ainult naaberolevaid 2k+1 tabelid (muudatus 2).

Seda algoritmi kirjeldab L.M. Boytsovi artikkel. "Räsimine allkirjaga." See põhineb sõna "struktuuri" üsna ilmsel esitusel bitibittide kujul, mida kasutatakse räsitabelis (allkirjana).

Indekseerimise käigus arvutatakse sellised räsid iga sõna jaoks ja sõnastiku sõnade loendi vastavus sellele räsile sisestatakse tabelisse. Seejärel arvutatakse otsingu käigus päringu jaoks räsi ja otsitakse kõik naaberräsid, mis erinevad algsest räsist mitte rohkem kui k biti võrra. Iga sellise räsi jaoks otsitakse sellele vastavat sõnade loendit.

Räsi arvutamise protsess – iga räsi bitt on seotud tähestiku tähemärkide rühmaga. Bit 1 asendis i räsi tähendab, et lähtesõna sisaldab tähemärki i-th tähestiku rühmad. Tähtede järjekorral sõnas pole absoluutselt mingit tähendust.

Ühe märgi eemaldamine kas ei muuda räsiväärtust (kui sõnas on veel tähemärke samast tähestikurühmast) või muutub sellele rühmale vastav bitt 0-ks. Samamoodi sisestamisel muutub kas üks bitt minge 1-le, muidu muudatusi ei toimu. Märkide asendamisel on kõik veidi keerulisem - räsi võib jääda üldse muutumatuks või muutuda 1 või 2 positsioonis. Permutatsioonide ajal muudatusi ei toimu, sest räsi koostamisel ei võeta arvesse sümbolite järjekorda, nagu varem märgitud. Seega tuleb k vea täielikuks katmiseks muuta vähemalt 2k natuke räsi.

Tööaeg keskmiselt k "mittetäieliku" veaga (sisestused, kustutamised ja ümberpaigutused, aga ka väike osa asendustest):

Iseärasused:
Tulenevalt asjaolust, et ühe tähemärgi asendamisel võivad kaks bitti korraga muutuda, ei anna algoritm, mis rakendab näiteks korraga mitte rohkem kui 2 biti pikkuseid moonutusi, tegelikult kogu tulemuste mahtu, kuna olulise (olenevalt räsi suuruse ja tähestiku suhte kohta) kahe asendusega sõnade osa (ja mis suurem suurus räsi, mida sagedamini põhjustab tähemärgi asendamine korraga kahe biti moonutamist ja seda vähem täielik on tulemus). Lisaks ei võimalda see algoritm eesliidete otsimist.

BK-puud

puud Burkhard-Keller on meetrilised puud, põhinevad selliste puude koostamise algoritmid meetrika omadusel täita kolmnurga ebavõrdsust:

See omadus võimaldab mõõdikutel moodustada suvalise mõõtmega mõõdikuruume. Sellised meetrilised ruumid ei pruugi olla eukleidiline, nii näiteks mõõdikud Levenštein Ja Damerau-Levenshtein vormi mitteeukleidiline ruumi. Nende omaduste põhjal on võimalik konstrueerida andmestruktuur, mis otsib sellises meetriruumis, milleks on Barkhard-Kelleri puud.

Täiustused:
Mõne mõõdiku võimalust saab kasutada piiranguga kauguse arvutamiseks, määrates ülemise piiri, mis on võrdne tipu laste maksimaalse kauguse ja sellest tuleneva kauguse summaga, mis protsessi veidi kiirendab:

Testimine

Testimine viidi läbi sülearvutiga Intel Core Duo T2500 (2GHz/667MHz FSB/2MB), 2Gb RAM, OS – Ubuntu 10.10 Desktop i686, JRE – OpenJDK 6 värskendus 20.

Testimisel kasutati Damerau-Levenshteini kaugust ja vigade arvu k = 2. Indeksi suurus on näidatud koos sõnastikuga (65 MB).

Indeksi suurus: 65 MB
Otsinguaeg: 320 ms / 330 ms
Tulemuste täielikkus: 100%

N-gramm (originaal)
Indeksi suurus: 170 MB
Indeksi loomise aeg: 32 s
Otsinguaeg: 71 ms / 110 ms
Tulemuste täielikkus: 65%
N-gramm (1. modifikatsioon)
Indeksi suurus: 170 MB
Indeksi loomise aeg: 32 s
Otsimisaeg: 39 ms / 46 ms
Tulemuste täielikkus: 63%
N-gramm (2. modifikatsioon)
Indeksi suurus: 170 MB
Indeksi loomise aeg: 32 s
Otsinguaeg: 37 ms / 45 ms
Tulemuste täielikkus: 62%

Indeksi suurus: 85 MB
Indeksi loomise aeg: 0,6 s
Otsinguaeg: 55 ms
Tulemuste täielikkus: 56,5%

BK-puud
Indeksi suurus: 150 MB
Indeksi loomise aeg: 120 s
Otsimisaeg: 540 ms
Tulemuste täielikkus: 63%

Kokku

Enamik indekseeritud hägusat otsingu algoritme ei ole tõeliselt alamlineaarsed (st nende tööaeg on asümptootiline O(log n) või madalam) ja nende töökiirus sõltub tavaliselt otseselt sellest N. Sellegipoolest võimaldavad mitmed täiendused ja täiendused saavutada piisavalt lühikesi tööaegu ka väga suure sõnaraamatumahu korral.

Samuti on palju mitmekesisemaid ja ebaefektiivsemaid meetodeid, mis põhinevad muu hulgas erinevate tehnikate ja mujal juba kasutusel olevate tehnikate kohandamisel antud ainevaldkonnaga. Nende meetodite hulgas on eesliitepuude (Trie) kohandamine hägusate otsinguprobleemidega, mida ma selle madala efektiivsuse tõttu ignoreerisin. Kuid on ka algupärasel lähenemisel põhinevaid algoritme, näiteks algoritm Massa-Nowak, mis, kuigi sellel on alaline asümptootiline tööaeg, on äärmiselt ebaefektiivne sellise ajahinnangu taga peituvate tohutute konstantide tõttu, mis avalduvad tohutu indeksi suuruse kujul.

Hägusate otsingualgoritmide praktiline kasutamine reaalselt otsingumootorid on tihedalt seotud foneetiliste algoritmidega, leksikaalsete tüvedega algoritmidega - sama sõna erinevate sõnavormide põhiosa eraldamine (näiteks Snowball ja Yandexi müstem pakuvad seda funktsiooni), samuti statistilise teabe põhjal järjestamine või keerukate keerukate mõõdikute kasutamine .

  • Levenshteini kaugus (koos väljalõike ja eesliite valikuga);
  • Damerau-Levenshteini kaugus (koos väljalõike ja eesliite valikuga);
  • Bitap-algoritm (Shift-OR / Shift-AND Wu-Manberi modifikatsioonidega);
  • Valimi laiendamise algoritm;
  • N-grammi meetod (originaal ja modifikatsioonidega);
  • Allkirja räsimise meetod;
  • BK-puud.
Tahtsin muuta koodi lihtsalt arusaadavaks ja samal ajal piisavalt tõhusaks praktiline rakendus. Minu ülesanne polnud JVM-ist viimast mahla välja pressida. Nautige.

Väärib märkimist, et selle teema uurimise käigus tulin välja mõned omapoolsed arendused, mis võimaldavad mul otsinguaega suurusjärgu võrra lühendada tänu indeksi suuruse mõõdukale suurenemisele ja mõningatele piirangutele otsinguvabadusele. vali mõõdikud. Aga see on hoopis teine ​​lugu.


Definitsioon Näited rakendatud probleemidest n-grammi keelemudeli loomine n-grammi tõenäosuse arvutamine Treeningkorpuse hõreduse kõrvaldamine o Add-one silumine o Witten-Belli diskonteerimine o Good-Turingi diskonteerimine o Katzs Backoff o Kustutatud interpolatsioon n-i hindamine -grammi keele mudel, kasutades entroopiat Sisu


N-gramm (inglise keeles N-gram) on mingi jada N elemendi alamjada. Vaatame sõnade jadasid. Unigrammid kass, koer, hobune,... Bigrammid väike kass, suur koer, tugev hobune,... Trigrammid väike kass sööb, suur koer haugub, tugev hobune jookseb,... Definitsioon


Näiteid rakendusprobleemidest Kõnetuvastus. Mõningaid erineva kirjapildiga sõnu hääldatakse samamoodi. Ülesanne on valida kontekstis õige sõna. Tekstide genereerimine etteantud teemal. Näide: Yandex.Abstracts. Otsige semantilisi vigu. Ta püüab peeneid välja tuua – süntaksi seisukohalt on see tõsi, semantika seisukohalt mitte. Ta püüab teada saada – see on õige. väljaselgitamist leitakse ingliskeelsetes tekstides palju sagedamini kui trahvi väljaselgitamist, mis tähendab, et kui teil on statistikat, saate seda tüüpi vea leida ja kõrvaldada


N-grammide keelemudeli loomine Loetletud rakendusprobleemide lahendamiseks tuleb luua N-grammide keelemudel. Mudeli loomiseks peate: 1. Arvutama n-grammi tõenäosused treeningkorpuses. 2. Likvideerige korpuse hõreduse probleem, kasutades üht silumismeetoditest. 3. Hinnake saadud n-grammi keelemudeli kvaliteeti entroopia abil.


N-grammide tõenäosuse arvutamine (1) Treeningkorpuses esinevad teatud n-grammid erineva sagedusega. Iga n-grammi kohta saame kokku lugeda, mitu korda see korpuses esineb. Saadud andmete põhjal saab ehitada tõenäosusliku mudeli, mille abil saab seejärel hinnata n-grammide tõenäosust mõnes testkorpuses.


N-grammi tõenäosuse arvutamine (2) Vaatame näidet. Koosnegu korpus ühest lausest: Nad pidasid basseini ääres piknikut, siis lebasid murule ja vaatasid tähti. Unigrammid: nad, korjatud, poolt, … Biggrammid: nad piknikkinud, noppinud, poolt, … trigrammid Nad noppinud poolt, noppinud basseini ääres, …


N-grammi tõenäosuse arvutamine (3) Nüüd saate n-gramme lugeda. Kõik tuvastatud bi- ja trigrammid ilmuvad korpuses üks kord. Kõik unigrammid, välja arvatud sõna the, esinevad samuti ühekordselt. Sõna the ilmub kolm korda. Nüüd, kui teame, mitu korda iga n-gramm esineb, saame koostada n-grammide tõenäosusmudeli. Unigrammide puhul saab sõna u tõenäosuse arvutada valemiga: Näiteks sõna a puhul on tõenäosus võrdne 3/16 (kuna korpuses on 16 sõna, millest 3 on sõna the). Sõna u esinemiste arv treeningkorpuses Nad pidasid basseini ääres piknikut, heitsid siis murule pikali ja vaatasid tähti


1, arvutatakse tõenäosus veidi erinevalt. Vaatleme bigrammide juhtumit: olgu vaja arvutada basseini bigrammi tõenäosus. Kui käsitleme iga bigrammi sõna mingiks sündmuseks, siis tõenäosus" title=" N-grammi tõenäosuse arvutamine (4) N-grammide puhul, kus n>1, arvutatakse tõenäosus veidi erinevalt. Vaatleme bigrammide juhtumit: olgu vaja arvutada basseini tõenäosus, kui arvestada iga bigrammi sõna mingiks sündmuseks, siis" class="link_thumb"> 9 !} N-grammi tõenäosuse arvutamine (4) N-grammi puhul, kus n>1, arvutatakse tõenäosus veidi erinevalt. Vaatleme bigrammide juhtumit: olgu vaja arvutada basseini bigrammi tõenäosus. Kui käsitleme iga bigrammi sõna sündmusena, siis saab sündmuste hulga tõenäosuse arvutada valemiga: Seega on bigrammi tõenäosus bassein:, kus 1, arvutatakse tõenäosus veidi erinevalt. Vaatleme bigrammide juhtumit: olgu vaja arvutada basseini bigrammi tõenäosus. Kui käsitleme iga bigrammi sõna mingiks sündmuseks, siis uskumus "> 1, arvutatakse tõenäosus mõnevõrra erinevalt Vaatleme bigrammi juhtumit: olgu vaja arvutada tõenäosus, et bigramm saab kogumi. Kui arvestada iga sõna bigrammi kui mõne sündmuse puhul, siis saab sündmuste hulga tõenäosuse arvutada valemiga : Seega arvutatakse bigrammi tõenäosus kogum:, kus "> 1, tõenäosus arvutatakse veidi erinevalt. Vaatleme bigrammide juhtumit: olgu vaja arvutada basseini bigrammi tõenäosus. Kui käsitleme iga bigrammi sõna mingiks sündmuseks, siis tõenäosus" title=" N-grammi tõenäosuse arvutamine (4) N-grammide puhul, kus n>1, arvutatakse tõenäosus veidi erinevalt. Vaatleme bigrammide juhtumit: olgu vaja arvutada basseini tõenäosus, kui arvestada iga bigrammi sõna mingiks sündmuseks, siis"> title="N-grammi tõenäosuse arvutamine (4) N-grammi puhul, kus n>1, arvutatakse tõenäosus veidi erinevalt. Vaatleme bigrammide juhtumit: olgu vaja arvutada basseini bigrammi tõenäosus. Kui käsitleme iga bigmi sõna mingiks sündmuseks, siis"> !}


N-grammi tõenäosuse arvutamine (5) Nüüd kaaluge suvalise n-grammi (või n-pikkuse lause) tõenäosuse arvutamist. Laiendades bigrammide juhtumit, saame n-grammi tõenäosuse valemi: Tõenäosuse arvutamine sellise valemi abil ei ole lihtne, seetõttu võetakse kasutusele lihtsustus - kasutada fikseeritud pikkusega ajalugu, s.t. Seega taandub lause tõenäosuse arvutamine selle lause moodustavate N-grammide tingimusliku tõenäosuse arvutamisele:




Korpuse hõreduse kõrvaldamine (1) Probleem silumata n-grammi keelemudeliga: mõne n-grammi puhul võib tõenäosust tugevalt alahinnata (või isegi nullida), kuigi tegelikkuses (testkorpuses) võivad need n-grammid esineda üsna sageli. . Põhjus: väljaõppekorpuse ja selle spetsiifilisuse piirangud. Lahendus: vähendades mõne n-grammi tõenäosust, suurenda nende n-grammide tõenäosust, mida treeningkorpuses ei kohanud (või kohtati üsna harva).




Korpuse hõreduse eemaldamine (3) Hõreduse eemaldamise algoritmid kasutavad järgmisi mõisteid: Tüübid – erinevad sõnad (sõnajadad) tekstis. Märgid – kõik sõnad (sõnajadad) tekstis. Nad pidasid basseini ääres piknikku, siis lamasid murule ja vaatasid tähti – 14 tüüpi, 16 märki





Add-one silumine (4) Meetod kutsub arvutustes esile tugeva vea (näiteks eelmisel slaidil näidati, et sõna hiina puhul vähenes bigrammide arv 8 korda). Testid on näidanud, et silumata mudel näitab sageli täpsemaid tulemusi. Järelikult on meetod huvitav ainult teoreetilisest vaatenurgast.


Witten-Belli diskonteerimine (1) Põhineb lihtsal ideel: kasutage treeningkorpuses esinevate n-grammide andmeid, et hinnata puuduvate n-grammide tõenäosust. Meetodi idee on võetud tihendusalgoritmidest: arvestatakse kahte tüüpi sündmusi - täidetud uus sümbol(tüüp) ja leitud sümbol (märk). Tõenäosuse valem kõigi puuduvate n-grammide jaoks (st tõenäosus, et testkorpuses kohtab n-grammi, mida treeningkorpuses ei olnud): N on märkide arv koolituskorpuses, T on tüüpide arv, mis on koolituskorpuses juba kohatud






Witten-Belli allahindlus (4) =>=> =>"> =>"> =>" title="Witten-Belli allahindlus (4) =>=>"> title="Witten-Belli allahindlus (4) =>=>"> !}




Good-Turingi diskonteerimine (1) Idee: n-grammide puhul, mis esinesid null korda (s korda), on tulemus võrdeline kord esinenud n-grammide arvuga (s + 1 korda). Vaatame näidet: oletame, et püüti 18 kala. Kokku püütud erinevat tüüpi– 6 ja kolmest liigist tabati vaid üks esindaja. Peame leidma tõenäosuse, et järgmine kala kuulub uude liiki. Kokku on võimalikke liike 7 (6 liiki on juba püütud).








Katzs Backoff (2) Koefitsient α on vajalik N-grammi jääktõenäosuse õigeks jaotamiseks vastavalt (N-1)-grammi tõenäosusjaotusele. Kui te ei sisesta α, on hinnang ekslik, sest võrdsust ei täideta: α arvutus on toodud aruande lõpus.




Keelemudeli hindamine entroopia abil (1) Entroopia on määramatuse mõõt. Entroopia abil saate määrata konkreetse rakenduse probleemi jaoks sobivaima N-grammi keelemudeli. Binaarne entroopia valem: Näide: Arvutage mündiviske testi entroopia. Vastus: 1 bitt eeldusel, et katse tulemused on võrdselt tõenäolised (kumbki pool ilmub tõenäosusega 1/2).


Keelemudeli hindamine entroopia abil (3) Erinevate keelemudelite võrdlemiseks kasutatakse ristentroopiat: Mida lähemal on ristentroopia väärtus H(p,m) tegelikule entroopiale H(p), seda parem on keelemudel: Meie puhul on H(p ) testkorpuse entroopia. m(w) – keelemudel (näiteks N-grammi mudel) Keelemudeli hindamine entroopia abil (4) Keelemudeli kvaliteedi hindamiseks on veel üks meetod, mis põhineb nn. ühenduvuse indikaator (hämmeldus). Idee: arvutage kogu testkorpuse tõenäosus. Parem mudel näitab suuremat tõenäosust. Hämmelduse valem: Seega, mida madalam on segadus, seda parem mudel


. Hämmastust saate tõlgendada kui sõnade keskmist arvu, mis võivad tulla pärast teatud sõna (st mida suurem on segadus, seda suurem on mitmetähenduslikkus ja seega halvem keelemudel). Seos segaduse ja binaarse entroopia vahel:


Keelemudeli hindamine entroopia abil (5) Vaatleme näiteks teatud korpuse hämmingusväärtusi, mis on saadud unigrammide, bigrammide ja trigrammide treenitud mudelite abil: Trigrammide puhul on segadus väikseim, kuna täpsustusi hõlbustab kõigi mudelite suurim ajaloo pikkus (võrdne 2-ga) trigrammide tingimuslike tõenäosuste arvutamisel. UnigramBigramTrigrami segadus

Soovin juurutada mõningaid n-grammi rakendusi (soovitavalt PHP-s).

Milline n-grammide tüüp on enamiku eesmärkide jaoks sobivam? Sõna või tähemärgi tase n-grammi tase? Kuidas saab PHP-s n-grammi tokenisaatorit rakendada?

Esiteks tahaksin teada, mis on N-gramm. Kas see on õige? Ma mõistan n-grammi järgmiselt:

Lause: "Ma elan New Yorgis."

märgitaseme birams (2 n jaoks): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", "n #", "#N", "NY", "Y #"

Kui teil on see n-grammiste osade massiiv, visake duplikaadid ja lisage iga sagedusosa jaoks loendur:

sõnataseme suurgrammid:

tähemärgi tasemel suurgrammid:

Kas see on õige?

Samuti tahaksin rohkem teada saada, mida saate n-grammidega teha:

  • Kuidas ma saan n-grammi abil teksti keelt määrata?
  • Kas masintõlget on võimalik n-grammi abil teha ka siis, kui sul pole kakskeelset korpust?
  • Kuidas luua rämpsposti filtrit (rämpspost, sink)? Kas ühendada n-grammid Bayesi filtriga?
  • Kuidas ma leian teema? Näiteks: kas seal on tekst korvpalli või koerte kohta? Minu lähenemine (tehke Vikipeedia artikliga "koerte" ja "korvpalli" kohta järgmist): joonistage mõlema dokumendi jaoks n-grammi vektorid, normaliseerige need, arvutage Manhattani/Eukleidilise kaugus, mida lähemal on tulemus 1-le, seda suurem on sarnasus saab olema

Kuidas suhtute minu taotlusesse, eriti viimasesse?

Loodan, et saate mind aidata. Tänan juba ette!

2 vastust

Wordi n-grammid on üldiselt kasulikumad enamiku teie mainitud tekstianalüüsi rakenduste jaoks, välja arvatud keeletuvastus, kus näiteks märgitrigrammid võivad anda paremaid tulemusi. Tõhusalt loote igas teid huvitavas keeles tekstikeha jaoks n-grammi vektori ja seejärel võrdlete iga korpuse trigrammide sagedusi klassifitseeritava dokumendi trigrammidega. Näiteks trigramm the ilmub tõenäoliselt palju sagedamini inglise keel kui saksa keeles ja annab teatud taseme statistilise korrelatsiooni. Kui teil on n-grammi vormingus dokumendid olemas, saate edasiseks analüüsiks valida paljude algoritmide, Baysi filtrite, N lähima naabri, tugivektori masinate jne vahel.

Teie mainitud rakendustest on masintõlge ilmselt kõige kaugem, kuna n-grammidega üksi teid väga kaugele ei vii. Sisendfaili teisendamine n-grammi esituseks on lihtsalt viis andmete vormindamiseks funktsiooni edasiseks analüüsiks, kuid kuna kaotate palju kontekstuaalset teavet, ei pruugi see tõlkimisel kasulik olla.

Üks asi, mida tuleb tähele panna, on see, et kui mõõtmed ei ühti, ei piisa ühe dokumendi jaoks vektori ja teise dokumendi vektori loomisest. See tähendab, et vektori esimene kirje ei saa olla ühes dokumendis ja on teises, vastasel juhul algoritmid ei tööta. Lõppkokkuvõttes saate vektoreid nagu , kuna enamik dokumente ei sisalda rohkem kui teid huvitavad n-grammid. See "vooder" nõuab ka seda, et määraksite eelnevalt kindlaks, millised ngrammid oma analüüsi kaasate. Seda rakendatakse sageli kahekäigulise algoritmina, et kõigepealt otsustada erinevate n-grammide statistiline olulisus, et otsustada, mida säilitada. Lisateabe saamiseks Google'i "funktsioonide valik".

Sõnapõhised n-grammid pluss vektormasina tugi on suurepärane viis teema tuvastamiseks, kuid klassifikaatori koolitamiseks vajate suurt tekstikorpust, mis on eelnevalt liigitatud teemasse ja väljaspool teemat. Sa leiad suur hulk uurimistöö, selgitades selle probleemi erinevaid lähenemisviise saidil, näiteks citeseerx. Ma ei soovitaks selle probleemi lahendamiseks kasutada eukleidilist kauguse lähenemisviisi, kuna see ei kaalu üksikuid n-gramme statistilise olulisuse alusel, seega peetakse kahte dokumenti, mis sisaldavad , a , on ja of, paremini vasteks kui kahte dokumenti , mis sisaldasid Baysi . Stoppsõnade eemaldamine huvipakkuvate n-grammide hulgast parandaks seda veidi.

Sul on n-grammi definitsiooni osas õigus.

Otsingutüüpi rakenduste jaoks saate kasutada sõnatasemel n-gramme. Märgitaseme n-gramme saab rohkem kasutada teksti enda analüüsimiseks. Näiteks teksti keele tuvastamiseks kasutaksin tähesagedusi võrreldes väljakujunenud keelesagedustega. See tähendab, et tekst peaks ligikaudu vastama selle keele tähtede esinemissagedusele.

PHP sõnade jaoks n-grammi tokenisaatorit saab teha strtoki abil:

Märkide jaoks kasutage split:

Seejärel saate massiivi lihtsalt jagada suvaliseks arvuks n-grammideks.

Bayesi filtreid tuleb õpetada kasutama rämpspostifiltritena, mida saab kasutada koos n-grammidega. Siiski peate talle palju panustama, et ta saaks õppida.

Teie viimane lähenemine kõlab lehe konteksti õppides korralik... seda on siiski üsna raske teha, kuid n-grammid tunduvad selle jaoks hea lähtepunktina.