Metod n gram. N-gram i lingvistik



Definition Exempel Tillämpningar Skapa en n-grams språkmodell Beräkna n-grams sannolikhet Eliminera gleshet i en träningskorpus o Add-one Smoothing o Witten-Bell-rabatter o Good-Turing-rabatter o Katzs Backoff o Raderad Interpolation Uppskattning av en n-gram-språkmodell med entropi Innehåll


N-gram (engelska N-gram) en undersekvens av N element i någon sekvens. Tänk på sekvenser av ord. Unigrams katt, hund, häst,... Bigrams liten katt, stor hund, stark häst,... Trigrams liten katt äter, stor hund skäller, stark häst springer,... Definition


Exempel på tillämpade uppgifter Taligenkänning. Vissa ord med olika stavningar uttalas likadant. Uppgiften är att välja rätt ord i sammanhanget. Generering av texter om ett givet ämne. Exempel: Yandex.Abstracts. Sök efter semantiska fel. Han försöker finslipa - när det gäller syntax, är det sant, när det gäller semantik, nej. Han försöker ta reda på det - eller hur. försöker ta reda på finns mycket oftare i engelska texter än att försöka finslipa, vilket innebär att om statistik finns tillgänglig kan du hitta och eliminera den här typen av fel


Skapande av en språkmodell av n-gram För att lösa de angivna tillämpade problemen är det nödvändigt att skapa en språkmodell av N-gram. För att skapa en modell behöver du: 1. Beräkna sannolikheterna för n-gram i träningskorpusen. 2. Åtgärda problemet med skrovets gleshet med en av anti-aliasingmetoderna. 3. Utvärdera kvaliteten på den resulterande språkmodellen av n-gram med hjälp av entropi.


Beräkna sannolikheten för N-gram (1) I träningskorpusen förekommer vissa n-gram med olika frekvenser. För varje n-gram kan vi räkna hur många gånger det förekommer i korpusen. Baserat på erhållen data kan en probabilistisk modell byggas, som sedan kan användas för att uppskatta sannolikheten för n-gram i någon testkorpus.


Beräkna sannolikheten för N-gram (2) Ta ett exempel. Låt korpusen bestå av en mening: De picknickade vid poolen, la sig sedan tillbaka på gräset och tittade på stjärnorna. Låt oss välja n-gram. Unigrams: De, picknickade, av, … Bigrams: De picknickade, picknickade av, vid, … Trigrams De picknickade av, picknickade vid, vid poolen, …


Beräkning av sannolikhet för N-gram (3) Nu är det möjligt att räkna n-gram. Alla valda bi- och trigram förekommer i korpusen en gång. Alla unigram, med undantag för ordet the, förekommer också en gång. Ordet förekommer tre gånger. Nu när vi vet hur många gånger varje n-gram förekommer kan vi bygga en probabilistisk modell av n-gram. När det gäller unigram kan sannolikheten för ordet u beräknas med hjälp av formeln: Till exempel för ordet kommer sannolikheten att vara 3/16 (eftersom det finns 16 ord i korpusen, varav 3 är ordet the) . Antal förekomster av ordet u i träningskorpusen De picknickade vid poolen, la sig sedan tillbaka i gräset och tittade på stjärnorna


1, anses sannolikheten något annorlunda. Tänk på fallet med bigram: låt det vara nödvändigt att beräkna sannolikheten för bigram poolen. Om vi ​​betraktar varje bigramord som en händelse, då tror vi" title="(!LANG:N-gram sannolikhetsberäkning (4) För n-gram, där n>1, beräknas sannolikheten något annorlunda. Betrakta fallet med bigram : låt det vara nödvändigt att beräkna digrammet poolen Om vi ​​betraktar varje ord i digram som en händelse, då tror vi" class="link_thumb"> 9 !} Beräkna sannolikheten för N-gram (4) För n-gram, där n>1, beräknas sannolikheten något annorlunda. Tänk på fallet med bigram: låt det vara nödvändigt att beräkna sannolikheten för bigram poolen. Om vi ​​betraktar varje bigramord som en händelse, så kan sannolikheten för en uppsättning händelser beräknas med formeln: Således är sannolikheten för bigrammet poolen:, där 1, anses sannolikheten något annorlunda. Tänk på fallet med bigram: låt det vara nödvändigt att beräkna sannolikheten för bigram poolen. Om vi ​​betraktar varje bigramord som någon händelse, och då tror "> 1, betraktas sannolikheten något annorlunda. Tänk på fallet med bigram: låt det vara nödvändigt att beräkna sannolikheten för bigrammet poolen. Om vi ​​betraktar varje bigramord som någon händelse, då kan sannolikheten för en uppsättning händelser beräknas med formeln : Således är sannolikheten för bigrammet poolen:, där "> 1, sannolikheten beräknas lite annorlunda. Tänk på fallet med bigram: låt det vara nödvändigt att beräkna sannolikheten för bigram poolen. Om vi ​​betraktar varje bigramord som en händelse, då tror vi" title="(!LANG:N-gram sannolikhetsberäkning (4) För n-gram, där n>1, beräknas sannolikheten något annorlunda. Betrakta fallet med bigram : låt det vara nödvändigt att beräkna digrammet poolen Om vi ​​betraktar varje ord i digram som en händelse, då tror vi"> title="Beräkna sannolikheten för N-gram (4) För n-gram, där n>1, beräknas sannolikheten något annorlunda. Tänk på fallet med bigram: låt det vara nödvändigt att beräkna sannolikheten för bigram poolen. Om vi ​​betraktar varje ord i diggrammet som en händelse, då tror vi"> !}


Beräkning av sannolikheten för N-gram (5) Betrakta nu beräkningen av sannolikheten för ett godtyckligt n-gram (eller en mening med längden n). Om vi ​​utökar fallet med bigram, får vi sannolikhetsformeln för n-gram Således reduceras beräkningen av sannolikheten för en mening till att beräkna den villkorade sannolikheten för de N-gram som utgör denna mening:




Eliminering av korpus gleshet (1) Problemet med en enkel (outjämnad) språkmodell av n-gram: för vissa n-gram kan sannolikheten vara kraftigt underskattad (eller till och med noll), även om dessa i verkligheten (i testkorpusen) n-gram kan förekomma ganska ofta . Orsak: begränsad utbildningskorpus och dess specificitet. Lösning: genom att sänka sannolikheten för några n-gram, öka sannolikheten för de n-gram som inte förekom (eller påträffades ganska sällan) i träningskorpusen.




Corpus Sparsity Elimination (3) Följande begrepp används i: Typer – olika ord (ordsekvenser) i texten. Tokens är alla ord (ordsekvenser) i texten. De picknickade vid poolen, la sig sedan tillbaka i gräset och tittade på stjärnorna - 14 typer, 16 polletter





Add-one-utjämning (4) Metoden framkallar ett kraftigt fel i beräkningarna (till exempel på föregående bild visades det att för ordet kinesiska minskades antalet bigram med 8 gånger). Tester har visat att den outjämnade modellen ofta visar mer exakta resultat. Därför är metoden endast intressant ur en teoretisk synvinkel.


Witten-Bell Discounting (1) Baserat på en enkel idé: använd data om n-gram som förekommer i träningskorpusen för att uppskatta sannolikheten för att sakna n-gram. Idén med metoden är hämtad från komprimeringsalgoritmer: två typer av händelser övervägs - de träffade en ny karaktär (typ) och de träffade en karaktär (token). Sannolikhetsformel för alla saknade n-gram (det vill säga sannolikheten att träffa ett n-gram i testkorpusen som inte fanns i träningskorpusen): N är antalet polletter i träningskorpusen, T är antalet typer som redan har påträffats i utbildningskorpusen






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




Good-Turing-rabatt (1) Idé: För n-gram som förekommer noll gånger (c gånger), är poängen proportionell mot antalet n-gram som förekommer en gång (c + 1 gånger). Tänk på ett exempel: Antag att 18 fiskar fångades. Totalt fångades 6 olika arter, och endast en representant fångades i tre arter. Vi måste hitta sannolikheten för att nästa fisk kommer att tillhöra en ny art. Det finns 7 möjliga arter totalt (6 arter har redan fångats).








Katzs Backoff (2) Koefficienten α är nödvändig för korrekt fördelning av restsannolikheten för N-gram i enlighet med sannolikhetsfördelningen för (N-1)-gram. Om du inte anger α blir uppskattningen felaktig, eftersom jämställdheten kommer inte att uppfyllas: Beräkningen av α ges i slutet av rapporten. Utvärdering av en språkmodell med hjälp av entropi (1) Entropi är ett mått på osäkerhet. Med hjälp av entropi kan man bestämma den mest lämpliga språkmodellen av N-gram för en given tillämpad uppgift. Binär entropiformel: Exempel: Beräkna entropin för ett myntkastningstest. Svar: 1 bit, förutsatt att resultaten av experimentet är lika sannolika (vardera sidan faller ut med en sannolikhet på 1/2).




Utvärdering av språkmodellen med hjälp av entropi (3) Korsentropi används för att jämföra olika språkmodeller: Ju närmare värdet av korsentropin H(p,m) den reella entropin H(p) desto bättre är språkmodellen: I vårt fall är H(p ) entropin av testkorpusen. m(w) – språkmodell (t.ex. N-gram-modell)


Utvärdering av en språkmodell med hjälp av entropi (4) Det finns en annan metod för att bedöma kvaliteten på en språkmodell, baserad på den s.k. anslutningsindikator (förvirring). Idé: Beräkna sannolikheten för hela testkorpusen. En bättre modell kommer att visa en högre sannolikhet. förvirring formel: Alltså, ju mindre förvirring, desto bättre modell. Förvirring kan tolkas som det genomsnittliga antalet ord som kan komma efter ett visst ord (dvs. ju mer förvirring, desto högre är tvetydigheten, och därför desto sämre språkmodell). Förhållandet mellan förvirring och binär entropi:


Uppskattning av en språkmodell med hjälp av entropi (5) Som ett exempel, betrakta värdena för förvirring för en del korpus, erhållna med hjälp av tränade modeller av unigram, bigram och trigram: När det gäller trigram är förvirring den minsta, eftersom disambiguation underlättas av den längsta historiklängden av alla modeller (lika med 2) vid beräkning av de villkorliga sannolikheterna för trigram. UnigramBigramTrigram Perplexity


Använder N-gram

Allmän användning av N-gram

  • utvinning av data för att samla en serie satellitbilder av jorden från rymden, för att sedan bestämma vilka specifika delar av jorden som finns på bilden,
  • söka efter genetiska sekvenser,
  • inom genetikområdet används för att bestämma från vilka specifika djurarter DNA-prover samlas in,
  • i datorkomprimering,
  • med N-gram indexeras som regel data relaterad till ljud.

N-gram används också i stor utsträckning i naturlig språkbehandling.

Använda N-gram för naturliga språkbehandlingsbehov

Inom området naturlig språkbehandling används N-gram främst för förutsägelse baserad på probabilistiska modeller. N-gram-modellen beräknar sannolikheten för det sista ordet i N-grammet om alla tidigare är kända. När man använder detta tillvägagångssätt för att modellera ett språk, antas det att utseendet på varje ord endast beror på de föregående orden.

En annan tillämpning av N-gram är upptäckt av plagiat. Om du delar upp texten i flera små fragment, representerade av n-gram, kan de enkelt jämföras med varandra och på så sätt få graden av likhet hos kontrollerade dokument. N-gram används ofta framgångsrikt för att kategorisera text och språk. Dessutom kan de användas för att skapa funktioner som gör att du kan få kunskap från textdata. Med hjälp av N-gram kan man effektivt hitta kandidater för att ersätta felstavade ord.

Googles forskningsprojekt

Googles forskningscenter har använt N-gram-modeller för ett brett utbud av forskning och utveckling. Dessa inkluderar projekt som statistisk översättning från ett språk till ett annat, taligenkänning, stavningskorrigering, informationsextraktion och mer. För dessa projekts syften användes korpustexter innehållande flera biljoner ord.

Google har beslutat att skapa sin egen utbildningsbyggnad. Projektet heter Google teracorpus och det innehåller 1 024 908 267 229 ord som samlats in från offentliga webbplatser.

Metoder för att extrahera n-gram

På grund av den frekventa användningen av N-gram för att lösa olika problem behövs en pålitlig och snabb algoritm för att extrahera dem från texten. Ett lämpligt n-gram-extraktionsverktyg ska kunna arbeta med obegränsad textstorlek, arbeta snabbt och effektivt använda tillgängliga resurser. Det finns flera metoder för att extrahera N-gram från text. Dessa metoder är baserade på olika principer:

Anteckningar

se även


Wikimedia Foundation. 2010 .

  • n-tv
  • N-cadherin

Se vad "N-gram" är i andra ordböcker:

    GRAM- (franska gramma, från grekiska grammatik). fransk enhet. vikt \u003d vikt av 1 kubikcentimeter destillerat vatten \u003d 22,5 ryska. aktier. Ordbok med främmande ord som ingår i det ryska språket. Chudinov A.N., 1910. GRAM-måttenhet för vikt i Frankrike ... Ordbok med främmande ord på ryska språket

    gram- gram, släkte. pl. gram och tillåtna (i muntligt tal efter siffror) gram. Hundra gram (gram). Till försvar för den nya formen av släktet. fall pl. antal gram gjordes av en kännare av den ryska språkförfattaren K. Chukovsky. Så här skrev han i boken "Living as Life": ... ... Ordbok för uttal och stresssvårigheter på modern ryska

    GRAM- GRAM, gram, make. (från grekiska grammatiket, bokstav). Den grundläggande viktenheten i det metriska systemet, lika med vikten av 1 kubikcentimeter vatten. Ett gram väger cirka 1/400 av ett pund. ❖ Gram atom (fys.) antalet gram av ett ämne lika med dess atomvikt. ... ... Ushakovs förklarande ordbok

    gram-röntgen- gram röntgen / n, gram röntgen / på, stav. pl. gram röntgen och gram röntgen... sammanslagna. Isär. Genom ett bindestreck.

    gram- Gram, detta enkla ord kunde inte ha angetts i felordboken, om inte för två omständigheter; För det första, om du vill visa upp dig med ett helt korrekt språk, då, efter att ha kommit till butiken, bedöva säljaren med det korrekta: Väg mig tvåhundra gram (inte ... ... Ordbok för misstag på ryska språket

    GRAM-ATOM- GRAM ATOM, mängden av ett grundämne vars massa, i gram, är lika med dess ATOM MASS. Den ersattes av SI-enhetsmolen. Till exempel är ett gram av en väteatom (H, atommassa = 1) lika med ett gram. b>GRAM EKVIVALENT, vikten i gram av det … … Vetenskaplig och teknisk encyklopedisk ordbok

    GRAM- GRAM, ah, släkte. pl. gram och gram, make. En massenhet i decimalsystemet av mått, en tusendels kilogram. Inte ett uns (inte) av någonting (vardagligt) inte alls, inte alls. Den här mannen (har inte) ett uns av samvete. | adj. gram, oj, oj. Förklarande ...... Förklarande ordbok för Ozhegov

    gram- men; pl. släkte. gram och gram; m. [franska. gram] En massenhet i det metriska systemet, en tusendels kilogram. ◊ Det finns inte (ett enda) gram. Inte alls, inte alls. I vem l. inte ett uns av falskhet. Ingen har ett uns av samvete. * * * gram (franska ... encyklopedisk ordbok

    Gramm Zenob Theophilus- (Gramme) (1826 1901), elektroingenjör. Född i Belgien, arbetade i Frankrike. Fick patent på en praktisk elektrisk generator med ringformigt ankare (1869). Han grundade den industriella produktionen av elektriska maskiner. * * * GRAM Zenob … … encyklopedisk ordbok

    gram atom- mängden av ett ämne i gram, numeriskt lika med dess atommassa. Termen rekommenderas inte för användning. I SI uttrycks mängden av ett ämne i mol. * * * GRAM ATOM GRAM ATOM, mängden av ett ämne i gram, numeriskt lika med dess atommassa (se ... encyklopedisk ordbok

    gram molekyl- mängden av ett ämne i gram, numeriskt lika med dess molekylvikt. Termen rekommenderas inte för användning. I SI uttrycks mängden av ett ämne i mol. * * * GRAMMOLECULE GRAMMOLECULE, mängden av ett ämne i gram, numeriskt lika med dess ... ... encyklopedisk ordbok

Semantisk kärna

För att framgångsrikt utveckla och öka webbplatsens synlighet i moderna verkligheter är det nödvändigt att ständigt utöka den semantiska kärnan. Ett av de bästa sätten att växa är att samla in konkurrentens sökord.

Idag är det inte svårt att få konkurrenternas semantik, eftersom. Det finns många tjänster, både betalda och gratis.

Gratis lista:

— megaindex.ru — Verktyg för webbplatssynlighet

- xtool.ru - en välkänd tjänst som också visar de sökord som webbplatsen är rankad för

Lista över betalda:

— spywords.ru — lämplig för Yandex och Google

- semrush.ru - fokuserade endast på Google

— prodvigator.ua — ukrainsk analog till spywords.ru

Förutom tjänster kan du också använda en manuell metod baserad på att dela upp titeln och beskrivningen i n-gram, vilket resulterar i en extra lista med fraser vid utgången.

N-gram - en sekvens av n element. I praktiken är N-grammet vanligare som en serie ord. En sekvens av två på varandra följande element kallas ofta digram, kallas en sekvens av tre element trigram. Minst fyra eller fler element betecknas som ett N-gram, N ersätts med antalet på varandra följande element.

Överväg denna teknik steg för steg:

- Ladda upp titeln (beskrivningen) på konkurrenterna. Kan göras med Screaming Frog SEO.

– I en textredigerare rensar vi den resulterande listan från tjänstedelar, skiljetecken och annat skräp. Jag använder funktionen "sök och ersätt" i textredigerarens sublima text (snabbtangenten ctrl+H), med vanliga uttryck:

- Välj önskat n-gram och ställ in frekvensen på minst ett. Det bästa alternativet är trigram och 4-gram:

– Vi får följande resultat:

Kolumnräknavisar antalet repetitionern-gram, kolumnfrekvens — frekvensn-gram.

Efter att vi har fått en lista med fraser måste vi analysera den och välja lämpliga nyckelord för att utöka den semantiska kärnan. Mer information finns i den relevanta delen av vår blogg.

Grupperingsförfrågningar

Det är mycket viktigt att förstå hur den semantiska kärnan av konkurrenter är grupperad, eftersom detta hjälper till att korrekt distribuera nyckelfraser på webbplatsens sidor.

För att göra detta, efter att vi har skapat en komplett lista med frågor, måste vi få relevanta sidor och positioner för konkurrenter (du kan använda tjänsten seolib.ru) och sedan jämföra med vår gruppering. Om du kan se att en konkurrent har bra positioner och samtidigt dess gruppering skiljer sig från vår (exempelvis är en konkurrents önskemål fördelade på olika sidor, medan vår har samma önskemål på en sida), måste du vara uppmärksam på detta och revidera målsidorna på din webbplats.

Låt oss överväga ett litet exempel på att jämföra grupperingen av en villkorad webbplats och dess konkurrent.

Som du kan se i tabellen har site.ru en målsida för alla sökord. Hos en konkurrent rankas olika sidor för samma frågor och upptar TOP eller nära TOP-positioner. Baserat på detta kan vi dra slutsatsen att grupperingen på site.ru måste ses över, i synnerhet är det nödvändigt att skapa en separat sida för nyckelfraser med ordet "fasad".

Textkvalitet

Det första och viktigaste att uppmärksamma när man analyserar konkurrenters texter är inte den kvantitativa komponenten (antal förekomster, textlängd etc.), utan den kvalitativa eller semantiska – hur användbar informationen är, vad konkurrenten erbjuder och hur han gör det.

Låt oss titta på några exempel.

Låt oss säga att du levererar blommor och på huvudsidan i texten garanterar du att de är färska. Till exempel, så här:

Blomsterleveranstjänstwebbplats. svgaranterar säkerheten för buketter även under den kalla årstiden.

Här är ett exempel från en av de tävlande:

Det är lönsamt att beställa doftsammansättningar från oss, eftersom vi garanterar 100% pengarna tillbaka-garanti om blommornas färskhet är osäker.

En konkurrents garanti backas upp av pengar, vilket är viktigare än en abstrakt garanti.

Tänk på ett annat exempel - texten på sidan för kategorin "keramiska plattor" i en onlinebutik:

Denna text bär ingen användbar semantisk belastning, fast vatten. Troligtvis vill personen som kom till webbplatsen och fattar ett köpbeslut veta fördelarna med produkten och möjliga konfigurationer, istället får han en meningslös uppsättning tecken.

Låt oss nu titta på en konkurrents text:

Den här texten är mer användbar eftersom kommunicerar kortfattat skillnaderna mellan plattor och hjälper dig att förstå hur du väljer rätt.

Genom att jämföra konkurrenters texter med dina egna kan du alltså få mycket användbar information som hjälper copywriters när de sammanställer TOR.

Texternas relevans

Om man fortsätter med temat texternas kvalitet kan man inte låta bli att beröra deras relevans. Idag, för att texten ska vara relevant, räcker det inte att bara ta med sökord. För att öka sidans relevans och samtidigt inte göra texten skräppost måste du använda ord relaterade till ämnet.

När man bedömer en texts relevans för en fråga analyserar sökmotorn inte bara förekomsten av nyckelord, utan även ytterligare ord, och bestämmer därmed textens betydelse. Till exempel, om vi skriver en text om en elefant, kan de relaterade orden övervägas: "snabel", "bettar", "natur", "zoo". Om texten om schackpjäsen är "elefant", kommer dessa ord att vara: "figur", "check", "drottning", etc.

Du kan få den mest lämpliga listan med ord för dina behov i konkurrenternas texter. För att göra detta måste du göra följande steg:

— Vi kopierar alla texter från TOP-10 för önskad högfrekvent begäran till olika textfiler.

– Vi tar bort tjänstespråk, skiljetecken och siffror från texter (övervägt tidigare).

- Radera ord på en rad - använd funktionen "sök och ersätt" med reguljära uttryck. Ersätt utrymme med \n.

- Därefter måste du föra alla ordformer till den vanliga ordboksformen (lemma). För att göra detta kan du använda tjänsten https://tools.k50project.ru/lemma/. I fältet anger du en lista med ord från varje fil separat och klickar på knappen "lemmetisera och mata ut som en csv-tabell". Resultatet ska bli 10 filer med lemmetiserade ord.

– I varje fil tar vi bort dubbletter av ord.

- Kombinera ord från filer till en lista.

— Nu behöver vi skapa en frekvensordbok. För att göra detta, lägg till den resulterande listan i tjänsten https://tools.k50project.ru/lemma/ och klicka på "bygg en frekvensordbok i form av CSV".

- Vår lista med ord är klar:

Om frekvensen är 10, användes detta ord på alla 10 platser, om 8, då bara på 8, etc. Vi rekommenderar att du använder de vanligaste orden, men intressanta lösningar kan hittas bland sällsynta ord.

På ett så enkelt sätt kan du få en lista med tematiska ord för att sammanställa TOR för copywriters.

Som du kan se är konkurrenter en mycket viktig informationskälla som kan hjälpa dig att optimera dina webbplatser bättre. I den här artikeln har jag täckt långt ifrån alla aspekter och i framtiden kommer jag att fortsätta skriva om vad som är användbart och hur du kan lära dig av dina konkurrenter.

Prenumerera på nyhetsbrev

Jag vill implementera några n-gram-applikationer (helst i PHP).

Vilken typ av n-gram är mer lämplig för de flesta ändamål? Ordnivå eller teckennivå n-gram nivå? Hur kan en n-grammatisk tokenizer implementeras i PHP?

Först skulle jag vilja veta vad N-gram är. Det är rätt? Så här förstår jag n-gram:

Förslag: "Jag bor i New York."

birams på ordnivå (2 för n): "# I", "Jag bor", "bor i", "i New York", "NY #"

teckennivå birams (2 för n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", "n#", "#N", "NY", "Y#"

När du har den här uppsättningen av n-gram delar, slänger du in dubbletter och lägger till en räknare för varje del som anger frekvensen:

bigram på ordnivå:

teckennivå bigram:

Är det korrekt?

Jag skulle också vilja veta mer om vad du kan göra med n-gram:

  • Hur kan jag upptäcka språket i en text med hjälp av n-gram?
  • Är det möjligt att göra maskinöversättning med n-gram även om man inte har en tvåspråkig korpus?
  • Hur skapar man ett spamfilter (spam, skinka)? Kombinera n-gram med Bayesian filter?
  • Hur hittar jag ett ämne? Till exempel: finns det en text om basket eller hundar? Mitt tillvägagångssätt (gör följande med Wikipedia-artikeln för "hundar" och "basket"): plotta n-gram-vektorerna för båda dokumenten, normalisera dem, beräkna avståndet Manhattan/Euclid, ju närmare resultatet är 1, desto högre likheten blir

Vad tycker du om min ansökan, speciellt den sista?

Hoppas du kan hjälpa mig. Tack på förhand!

2 svar

Ord n-gram kommer i allmänhet att vara mer användbart för de flesta textanalysapplikationer du nämnde, med möjliga undantag för språkdefinition, där något som teckentrigram kan ge bättre resultat. Effektivt skulle du skapa en vektor av n-gram för textkroppen på varje språk du är intresserad av, och sedan jämföra trigramfrekvenserna i varje korpus med dem i dokumentet du klassificerar. Till exempel kommer trigrammet sannolikt att visas mycket oftare på engelska än på tyska och skulle ge en viss grad av statistisk korrelation. När du väl har n-gram dokument har du ett urval av många algoritmer för vidare analys, Baysian Filter, N Nearest Neighbor, Support Vector Machines, etc.

Av de applikationer du nämnde är maskinöversättning förmodligen den mest långsökta eftersom enbart n-gram inte kommer dig särskilt långt på vägen. Att konvertera en indatafil till n-gram-representation är bara ett sätt att lägga in data i ett format för ytterligare funktionsanalys, men eftersom du förlorar mycket kontextuell information kanske det inte är användbart för översättning.

En sak att notera är att det inte räcker att skapa en vektor för ett dokument och en vektor för ett annat dokument om dimensionerna inte stämmer överens. Det vill säga, den första posten i vektorn kan inte vara i ett dokument och finns i ett annat, annars fungerar inte algoritmerna. Du kommer att sluta med vektorer som , eftersom de flesta dokument inte innehåller mer än de n-gram du är intresserad av. Denna "lining" kräver också att du i förväg bestämmer vilka ngram du ska ta med i din analys. Ofta implementeras detta som en tvåpassalgoritm för att först bestämma den statistiska signifikansen för de olika n-grammen för att bestämma vad som ska behållas. Google "funktionsval" för mer information.

Ordbaserade n-gram plus stöd för vektormaskiner är ett utmärkt sätt att definiera ett ämne, men för att förbereda en klassificerare behöver du en stor korpus av text som är förklassificerad i "on-topic" och "off-topic" ämnen. Du hittar ett stort antal forskningsartiklar som förklarar olika tillvägagångssätt för detta problem på en webbplats som citeseerx. Jag skulle inte rekommendera den euklidiska avståndsmetoden för detta problem, eftersom den inte väger individuella n-gram baserat på statistisk signifikans, så två dokument som inkluderar , a , är och av skulle anses vara en bättre matchning än två dokument , som innefattade Baysian. Att ta bort stopporden från dina n-gram av intresse skulle förbättra detta lite.

Du har rätt när det gäller definitionen av n-gram.

Du kan använda n-gram på ordnivå för applikationer av söktyp. Teckennivå n-gram kan användas mer för att tolka själva texten. Till exempel, för att identifiera språket i en text, skulle jag använda bokstavsfrekvenserna mot de etablerade språkfrekvenserna. Det vill säga att texten ungefär ska motsvara frekvensen av förekomst av bokstäver på detta språk.

Den n-grammatiska tokenizern för ord i PHP kan göras med strtok:

För tecken, använd split:

Du kan sedan bara dela upp arrayen hur du vill i valfritt antal n-gram.

Bayesiska filter måste tränas för att användas som spamfilter som kan användas tillsammans med n-gram. Men du måste ge honom mycket input för att han ska lära sig.

Ditt sista tillvägagångssätt låter anständigt eftersom det lär sig sidans sammanhang... det är fortfarande ganska knepigt att göra, men n-gram verkar vara en bra utgångspunkt för detta.

Dessa algoritmer är designade för att söka på tidigare okänd text och kan användas till exempel i textredigerare, dokumentvisare eller webbläsare för att söka på en sida. De kräver ingen förbearbetning av text och kan arbeta med en kontinuerlig ström av data.

Linjär sökning

En enkel sekventiell tillämpning av ett givet mått (till exempel Levenshtein-måttet) på ord från inmatningstexten. När du använder ett mått med en gräns tillåter den här metoden dig att uppnå optimal prestanda. Men samtidigt desto mer k, ju längre körtiden ökar. Asymptotisk tidsuppskattning - O(kn).

Bitap (även känd som Shift-Or eller Baeza-Yates-Gonnet, och dess modifiering från Wu-Manber)

Algoritm bitap och dess olika modifieringar används oftast för fuzzy sökning utan indexering. Dess variant används till exempel i unix-verktyget agrep , som utför funktioner som liknar standardgrepet , men med stöd för fel i sökfrågan och till och med ger begränsade möjligheter att använda reguljära uttryck.

För första gången föreslogs idén om denna algoritm av medborgare Ricardo Baeza-Yates Och Gaston Gonnet, publicerade en relaterad artikel 1992.
Den ursprungliga versionen av algoritmen behandlar bara teckenbyten och beräknar faktiskt avståndet Hamming. Men lite senare sol wu Och Udi Manber föreslog en modifiering av denna algoritm för att beräkna avståndet Levenshtein, dvs. gav stöd för insättningar och borttagningar och utvecklade den första versionen av agrep-verktyget baserat på det.






Resultatvärde

Var k- antal misstag, j- teckenindex, s x - teckenmask (i masken är enstaka bitar placerade på positioner som motsvarar positionerna för det givna tecknet i begäran).
En matchning eller icke-matchning till frågan bestäms av den allra sista biten av den resulterande vektorn R.

Den höga hastigheten hos denna algoritm säkerställs av bitparallellism av beräkningar - i en operation är det möjligt att utföra beräkningar på 32 eller fler bitar samtidigt.
Samtidigt stöder den triviala implementeringen sökningen efter ord med en längd på högst 32. Denna begränsning bestäms av standardtypens bredd int(på 32-bitars arkitekturer). Du kan också använda typer av stora dimensioner, men detta kan sakta ner algoritmen till viss del.

Trots det faktum att den asymptotiska körtiden för denna algoritm O(kn)är samma som den linjära metoden, den är mycket snabbare med långa frågor och antalet fel köver 2.

Testning

Testning utfördes på en text på 3,2 miljoner ord, den genomsnittliga ordlängden var 10.
Exakt sökning
Söktid: 3562 ms
Sök med Levenshtein-måttet
Söktid kl k=2: 5728 ms
Söktid kl k=5: 8385 ms
Sök med Bitap-algoritmen med Wu-Manber-modifieringar
Söktid kl k=2: 5499 ms
Söktid kl k=5: 5928 ms

Uppenbarligen är en enkel sökning med måtten, till skillnad från Bitap-algoritmen, mycket beroende av antalet fel. k.

Men när det gäller att söka i stora mängder oförändrad text kan söktiden reduceras avsevärt genom att förbearbeta sådan text, även kallad indexering.

Luddiga sökalgoritmer med indexering (offline)

En egenskap hos alla luddiga sökalgoritmer med indexering är att indexet är byggt enligt en ordbok som sammanställs från källtexten eller en lista med poster i en databas.

Dessa algoritmer använder olika tillvägagångssätt för att lösa problemet - vissa av dem använder reduktion till exakt sökning, andra använder egenskaperna hos metriken för att bygga olika rumsliga strukturer, och så vidare.

Först och främst, i det första steget, byggs en ordbok från källtexten, som innehåller ord och deras positioner i texten. Du kan också räkna frekvensen av ord och fraser för att förbättra kvaliteten på sökresultaten.

Det antas att indexet, liksom ordboken, är helt laddat i minnet.

Taktiska och tekniska egenskaper hos ordboken:

  • Källtext - 8,2 gigabyte material från Moshkov-biblioteket (lib.ru), 680 miljoner ord;
  • Ordboksstorlek - 65 megabyte;
  • Antal ord - 3,2 miljoner;
  • Den genomsnittliga ordlängden är 9,5 tecken;
  • Root genomsnittlig kvadratordslängd (kan vara användbar vid utvärdering av vissa algoritmer) - 10,0 tecken;
  • Alfabet - versaler A-Z, utan E (för att förenkla vissa operationer). Ord som innehåller icke-alfabetiska tecken ingår inte i ordboken.
Ordboksstorlekens beroende av textvolymen är inte strikt linjär - upp till en viss volym bildas en grundläggande ordram som sträcker sig från 15 % vid 500 tusen ord till 5 % vid 5 miljoner, och sedan närmar sig beroendet linjärt , sakta minskar och når 0,5 % vid 680 miljoner ord. Det efterföljande upprätthållandet av tillväxten säkerställs för det mesta med sällsynta ord.

Exempel på expansionsalgoritm

Denna algoritm används ofta i stavningskontrollsystem (d.v.s. stavningskontroller), där storleken på ordboken är liten eller där hastighet inte är huvudkriteriet.
Det bygger på att reducera problemet med suddig sökning till det exakta sökproblemet.

Från den ursprungliga frågan byggs en uppsättning "felaktiga" ord, för var och en av dem görs en exakt sökning i ordboken.

Dess körtid beror starkt på antalet k fel och på storleken på alfabetet A, och i fallet med att använda en binär ordbokssökning är:

Till exempel när k = 1 och ord med längd 7 (till exempel "Krokodil") i det ryska alfabetet, kommer uppsättningen av felaktiga ord att vara cirka 450 i storlek, det vill säga det kommer att vara nödvändigt att göra 450 ordboksfrågor, vilket är ganska acceptabelt.
Men redan kl k = 2 storleken på en sådan uppsättning kommer att vara mer än 115 tusen alternativ, vilket motsvarar en fullständig uppräkning av en liten ordbok, eller 1/27 i vårt fall, och därför kommer körtiden att vara ganska lång. Samtidigt bör man inte glömma att för vart och ett av dessa ord är det nödvändigt att söka efter en exakt matchning i ordboken.

Egenskaper:
Algoritmen kan enkelt modifieras för att generera "felaktiga" varianter enligt godtyckliga regler, och kräver dessutom ingen preliminär bearbetning av ordboken, och följaktligen ytterligare minne.
Möjliga förbättringar:
Det är möjligt att generera inte hela uppsättningen av "felaktiga" ord, utan bara de av dem som är mest sannolikt att förekomma i en verklig situation, till exempel ord som tar hänsyn till vanliga stavnings- eller skrivfel.

Denna metod har funnits länge och är den mest använda, eftersom implementeringen är extremt enkel och den ger ganska bra prestanda. Algoritmen bygger på principen:
"Om ord A matchar ord B, givet flera fel, kommer de med en hög grad av sannolikhet att ha minst en gemensam delsträng med längden N."
Dessa delsträngar med längden N kallas N-gram.
Under indexeringen delas ordet upp i sådana N-gram, och sedan ingår detta ord i listorna för vart och ett av dessa N-gram. Under sökningen delas frågan även in i N-gram, och för var och en av dem söks en lista med ord som innehåller en sådan delsträng sekventiellt.

De vanligaste i praktiken är trigram - delsträngar med längd 3. Att välja ett större värde på N leder till en begränsning av den minsta ordlängden, vid vilken feldetektering redan är möjlig.

Egenskaper:
N-gram-algoritmen hittar inte alla möjliga felstavade ord. Om vi ​​till exempel tar ordet VOTKA, och bryter ner det i trigram: IN T KA → VO T HANDLA OM T TILL T KA - du kan se att de alla innehåller felet T. Således kommer ordet "VODKA" inte att hittas, eftersom det inte innehåller något av dessa trigram och inte kommer att hamna i listorna som motsvarar dem. Således, ju kortare längden på ett ord och ju fler fel det innehåller, desto större är chansen att det inte hamnar i listorna som motsvarar N-gram av frågan och inte kommer att finnas i resultatet.

Samtidigt lämnar N-gram-metoden fullt utrymme för att använda dina egna mätvärden med godtyckliga egenskaper och komplexitet, men du måste betala för detta - när du använder den behöver du fortfarande räkna upp cirka 15% av ordboken sekventiellt, vilket är ganska mycket för stora ordböcker.

Möjliga förbättringar:
Det är möjligt att dela upp hashtabellerna för N-gram efter längden på orden och efter positionen för N-grammet i ordet (modifiering 1). Hur längden på det sökta ordet och frågan inte kan skilja sig mer än k, och positionerna för ett N-gram i ett ord kan inte skilja sig mer än k. Således kommer det att vara nödvändigt att kontrollera endast tabellen som motsvarar positionen för detta N-gram i ordet, samt k tabeller till vänster och k tabeller till höger, dvs. Total 2k+1 intilliggande bord.

Du kan ytterligare minska storleken på den uppsättning som behövs för att skanna genom att dela upp tabellerna efter ordlängd, och på liknande sätt titta igenom endast angränsande tabeller. 2k+1 tabeller (modifiering 2).

Denna algoritm beskrivs i artikeln av L.M. Boytsov. Signaturhashning. Den bygger på en ganska uppenbar representation av ett ords "struktur" i form av bitar, som används som en hash (signatur) i en hashtabell.

Under indexering beräknas sådana hash för vart och ett av orden, och överensstämmelsen mellan listan med ordboksord och denna hash anges i tabellen. Sedan, under sökningen, beräknas en hash för frågan och alla angränsande hash som skiljer sig från den ursprungliga med högst k bitar sorteras bort. För var och en av dessa hash, söks listan över motsvarande ord.

Processen att beräkna en hash - varje bit av hashen tilldelas en grupp tecken från alfabetet. Bit 1 på position i i en hash betyder att originalordet innehåller ett tecken från i-th alfabetsgrupper. Ordningsordningen på bokstäverna i ordet är absolut irrelevant.

Att ta bort ett tecken kommer antingen inte att ändra hashvärdet (om det fortfarande finns tecken från samma alfabetgrupp i ordet), eller så ändras biten som motsvarar denna grupp till 0. När den infogas, på samma sätt, kommer endera biten att sätts till 1, annars blir det inga ändringar. När du byter tecken är allt lite mer komplicerat - hashen kan antingen förbli oförändrad alls, eller så kan den ändras i 1 eller 2 positioner. Vid permutering sker inga förändringar alls, eftersom teckenordningen vid konstruktion av en hash, som tidigare noterats, inte tas med i beräkningen. För att helt täcka k-fel måste du alltså ändra åtminstone 2k lite i hashen.

Drifttiden, i genomsnitt, med k "ofullständiga" (infogningar, raderingar och införlivningar, såväl som en liten del av ersättningar) fel:

Egenskaper:
På grund av det faktum att två bitar kan ändras samtidigt när ett tecken ersätts, kommer en algoritm som implementerar till exempel förvrängning av högst 2 bitar samtidigt inte att producera hela mängden resultat på grund av frånvaron av en betydande (beroende på förhållandet mellan hashstorleken och alfabetet) del av orden med två ersättningar (och ju större hashstorleken är, desto oftare leder en teckenersättning till förvrängning av två bitar samtidigt, och desto mindre komplett resultatet blir). Dessutom tillåter inte denna algoritm prefixsökningar.

BK träd

Träd Burkhard-Kellerär metriska träd, är algoritmerna för att konstruera sådana träd baserade på egenskapen hos metriken för att möta triangelolikheten:

Den här egenskapen tillåter mätningar att bilda metriska utrymmen av godtycklig dimension. Sådana metriska utrymmen är inte nödvändigtvis euklidisk, så till exempel måtten Levenshtein Och Damerau-Levenshtein form icke-euklidiskt Plats. Baserat på dessa egenskaper kan du bygga en datastruktur som söker i ett sådant metriskt utrymme, som är Barkhard-Keller-träden.

Förbättringar:
Du kan använda förmågan hos vissa mått för att beräkna avstånd med en begränsning genom att sätta en övre gräns lika med summan av det maximala avståndet till ättlingarna till vertexet och det resulterande avståndet, vilket kommer att påskynda processen något:

Testning

Testning utfördes på en bärbar dator med Intel Core Duo T2500 (2GHz/667MHz FSB/2MB), 2Gb RAM, OS - Ubuntu 10.10 Desktop i686, JRE - OpenJDK 6 Update 20.

Testning utfördes med avståndet Damerau-Levenshtein och antalet fel k = 2. Indexstorleken anges tillsammans med ordboken (65 MB).

Indexstorlek: 65 MB
Söktid: 320ms / 330ms
Resultatens fullständighet: 100 %

N-gram (original)
Indexstorlek: 170 MB
Index skapande: 32 s
Söktid: 71ms / 110ms
Resultatens fullständighet: 65 %
N-gram (modifiering 1)
Indexstorlek: 170 MB
Index skapande: 32 s
Söktid: 39ms / 46ms
Resultatens fullständighet: 63 %
N-gram (modifiering 2)
Indexstorlek: 170 MB
Index skapande: 32 s
Söktid: 37ms / 45ms
Resultatens fullständighet: 62 %

Indexstorlek: 85 MB
Index skapande: 0,6 s
Söktid: 55ms
Resultatens fullständighet: 56,5 %

BK träd
Indexstorlek: 150 MB
Index skapande: 120 s
Söktid: 540ms
Resultatens fullständighet: 63 %

Total

De flesta indexerade fuzzy sökalgoritmer är inte riktigt sublinjära (d.v.s. har en asymptotisk körtid O(log n) eller lägre), och deras arbetshastighet är vanligtvis direkt beroende av N. Ändå gör många förbättringar och finesser det möjligt att uppnå en tillräckligt kort drifttid även med mycket stora volymer ordböcker.

Det finns också många fler olika och ineffektiva metoder som bland annat bygger på anpassning av olika tekniker och tekniker som redan används någon annanstans till ett givet ämnesområde. Bland dessa metoder är anpassningen av prefixträd (Trie) till luddiga sökproblem, som jag lämnade utan uppsikt på grund av dess låga effektivitet. Men det finns också algoritmer baserade på ursprungliga tillvägagångssätt, till exempel algoritmen Maass-Novak, som, även om den har en sublinjär asymptotisk gångtid, är extremt ineffektiv på grund av de enorma konstanterna som gömmer sig bakom en sådan tidsuppskattning, som manifesterar sig i form av en enorm indexstorlek.

Den praktiska användningen av suddiga sökalgoritmer i riktiga sökmotorer är nära besläktad med fonetiska algoritmer, lexikaliska härledningsalgoritmer - som framhäver basdelen av olika ordformer av samma ord (till exempel tillhandahålls sådan funktionalitet av Snowball och Yandex mystem), som såväl som rangordning baserat på statistisk information eller med hjälp av komplexa sofistikerade mätvärden.

  • Levenshtein-avstånd (med klippning och prefixalternativ);
  • Avstånd Damerau-Levenshtein (med klippning och prefixalternativ);
  • Bitap-algoritm (Shift-ELLER / Shift-AND med Wu-Manber-modifieringar);
  • Exempel på expansionsalgoritm;
  • N-gram metod (original och med modifieringar);
  • Signaturhashningsmetod;
  • BK-träd.
Jag ville göra koden lätt att förstå, och samtidigt tillräckligt effektiv för praktisk användning. Att pressa de sista juicerna ur JVM var inte en del av mina uppgifter. njut av.

Det är värt att notera att i processen att studera detta ämne kom jag på några av mina egna utvecklingar som gör att jag kan minska söktiden med en storleksordning på grund av en måttlig ökning av indexets storlek och en viss begränsning i friheten att välja måttenhet. Men det är en helt annan historia.







2022 gtavrl.ru.