N-грама. Подобряване на вътрешната оптимизация с помощта на конкуренти Вижте какво е "N-gram" в други речници

Използване на N-грама

Общо използване на N-грама

  • извличане на данни за групиране на серия от сателитни изображения на Земята от космоса, за да се реши след това кои конкретни части от Земята са в изображението,
  • търсене на генетични последователности,
  • в областта на генетиката се използват, за да се определи от кои специфични животински видове са събрани ДНК проби,
  • при компютърна компресия,
  • с помощта на N-грама, като правило, данните, свързани със звука, се индексират.

N-грамите също са широко използвани в обработката на естествен език.

Използване на N-грама за нуждите от обработка на естествен език

В областта на обработката на естествен език N-грамите се използват главно за прогнозиране на базата на вероятностни модели. N-грам моделът изчислява вероятността за последната дума на N-грама, ако всички предишни са известни. Когато се използва този подход за моделиране на език, се приема, че появата на всяка дума зависи само от предишните думи.

Друго приложение на N-грамите е откриването на плагиатство. Ако разделите текста на няколко малки фрагмента, представени от n-грама, те могат лесно да бъдат сравнени един с друг и по този начин да се получи степента на сходство на контролираните документи. N-грамите често се използват успешно за категоризиране на текст и език. Освен това те могат да се използват за създаване на функции, които ви позволяват да получавате знания от текстови данни. Използвайки N-грама, човек може ефективно да намери кандидати за замяна на грешно изписани думи.

Изследователски проекти на Google

Изследователските центрове на Google са използвали N-gram модели за широк спектър от изследвания и разработки. Те включват проекти като статистически превод от един език на друг, разпознаване на реч, корекция на правописа, извличане на информация и др. За целите на тези проекти са използвани корпусни текстове, съдържащи няколко трилиона думи.

Google реши да създаде своя собствена образователна сграда. Проектът се нарича Google teracorpus и съдържа 1 024 908 267 229 думи, събрани от публични уебсайтове.

Методи за извличане на n-грама

Поради честото използване на N-грама за решаване на различни задачи е необходим надежден и бърз алгоритъм за извличането им от текста. Подходящ инструмент за извличане на n-gram трябва да може да работи с неограничен размер на текста, да работи бързо и да използва ефективно наличните ресурси. Има няколко метода за извличане на N-грама от текст. Тези методи се основават на различни принципи:

Бележки

Вижте също


Фондация Уикимедия. 2010 г.

  • n-tv
  • N-кадхерин

Вижте какво е "N-gram" в други речници:

    ГРАМ- (френски gramme, от гръцки gramma черта). френска единица. тегло \u003d тегло на 1 кубичен сантиметър дестилирана вода \u003d 22,5 руски. акции. Речник на чужди думи, включени в руския език. Чудинов А.Н., 1910 г. ГРАМ мерна единица за тегло във Франция ... Речник на чужди думи на руския език

    грам- грам, род. мн.ч. грамове и допустими (в устната реч след числителни) грамове. Сто грама (грама). В защита на новата форма на рода. дело мн.ч. брой грамове е направен от познавач на руския език писател К. Чуковски. Ето какво пише той в книгата "Да живееш като живот": ... ... Речник на трудностите в произношението и стреса в съвременния руски език

    ГРАМ- ГРАМ, грам, съпруг. (от гръцки граматически знак, буква). Основната единица за тегло в метричната система, равна на теглото на 1 кубичен сантиметър вода. Един грам тежи около 1/400 от паунд. ❖ Грам атом (физ.) броят на грамовете на веществото, равен на атомното му тегло. ... ... Тълковен речник на Ушаков

    грам-рентген- грам рентген / n, грам рентгенов / на, пръчка. мн.ч. грам рентген и грам рентген... обединени. На части. Чрез тире.

    грам- Грам, тази проста дума не би могла да бъде дадена в речника на грешките, ако не бяха две обстоятелства; първо, ако искате да се покажете с абсолютно правилен език, тогава, като дойдете в магазина, зашеметете продавача с правилния: Претеглете ми двеста грама (не ... ... Речник на грешките на руския език

    ГРАМ-АТОМ- ГРАМ АТОМ, количеството на елемент, чиято маса в грамове е равна на неговата АТОМНА МАСА. Той беше заменен от мол за единица SI. Например един грам водороден атом (Н, атомна маса = 1) е равен на един грам. b>ГРАМ ЕКВИВАЛЕНТ, теглото в грамове на това… … Научно-технически енциклопедичен речник

    ГРАМ- ГРАМ, ах, род. мн.ч. грамове и грамове, съпруг. Единица за маса в десетичната система от мерки, една хилядна от килограма. Нито една унция (не) от нищо (разговорно) изобщо не, изобщо. Този човек (няма) и грам съвест. | прил. грам, о, о. Обяснително ... ... Обяснителен речник на Ожегов

    грам- но; мн.ч. род. грамове и грамове; м. [френски. грам] Единица за маса в метричната система, една хилядна от килограма. ◊ Няма (един) грам. Съвсем не, никак. В когото л. нито капка лъжа. Никой няма грам съвест. * * * грама (френски ... енциклопедичен речник

    Грам Зеноб Теофил- (Gramme) (1826 1901), електроинженер. Роден в Белгия, работил във Франция. Получава патент за практичен електрически генератор с пръстеновидна арматура (1869 г.). Основава промишленото производство на електрически машини. * * * ГРАМ Зеноб… … енциклопедичен речник

    грам атом- количеството на веществото в грамове, числено равно на неговата атомна маса. Терминът не се препоръчва за употреба. В SI количеството на веществото се изразява в молове. * * * GRAM ATOM GRAM ATOM, количеството на веществото в грамове, числено равно на неговата атомна маса (виж ... енциклопедичен речник

    грам молекула- количеството на веществото в грамове, числено равно на молекулното му тегло. Терминът не се препоръчва за употреба. В SI количеството на веществото се изразява в молове. * * * ГРАМ МОЛЕКУЛА ГРАМ МОЛЕКУЛА, количеството вещество в грамове, числено равно на неговото ... ... енциклопедичен речник

Семантично ядро

За успешното развитие и повишаване на видимостта на сайта в съвременните реалности е необходимо непрекъснато разширяване на семантичното ядро. Един от най-добрите начини за растеж е да събирате конкурентни ключови думи.

Днес не е трудно да се получи семантиката на конкурентите, т.к. Има много услуги, както платени, така и безплатни.

Безплатен списък:

— megaindex.ru — Инструмент за видимост на сайта

- xtool.ru - добре позната услуга, която също така показва ключовите думи, по които е класиран сайтът

Списък на платените:

— spywords.ru — подходящ за Yandex и Google

- semrush.ru - фокусиран само върху Google

— prodvigator.ua — украински аналог на spywords.ru

В допълнение към услугите, можете да използвате и ръчен метод, базиран на разделяне на заглавието и описанието на n-грама, в резултат на което на изхода се получава допълнителен списък с фрази.

N-грам - последователност от n елемента. На практика N-грамата е по-често срещана като поредица от думи. Често се нарича последователност от два последователни елемента диграма, се нарича последователност от три елемента триграма. Най-малко четири или повече елемента са обозначени като N-грам, N се заменя с броя на последователните елементи.

Помислете за тази техника стъпка по стъпка:

- Качете заглавието (описанието) на състезателите. Може да се направи с Screaming Frog SEO.

- В текстов редактор почистваме получения списък от обслужващи части на речта, препинателни знаци и друг боклук. Използвам функцията "търсене и замяна" в текстов редактор възвишен текст (горещ клавиш ctrl+H), използвайки регулярни изрази:

- Изберете желания n-грам и задайте честотата на поне една. Най-добрият вариант са триграми и 4 грама:

- Получаваме следния резултат:

Колонаброяпоказва броя на повторениятан-грам, колоначестота - честотан-грамове.

След като получим списък с фрази, трябва да го анализираме и да изберем подходящите ключови думи, за да разширим семантичното ядро. Повече подробности можете да намерите в съответния раздел на нашия блог.

Групиране на заявки

Много е важно да се разбере как се групира семантичното ядро ​​на конкурентите, т.к това помага за правилното разпространение на ключови фрази на страниците на сайта.

За да направим това, след като генерираме пълен списък със заявки, трябва да получим подходящи страници и позиции на конкуренти (можете да използвате услугата seolib.ru) и след това да сравним с нашето групиране. Ако виждате, че даден конкурент има добри позиции и в същото време групирането му се различава от нашето (например заявките на конкурент са разпределени на различни страници, докато нашата има едни и същи заявки на една страница), трябва да обърнете внимание на това и преразгледайте целевите страници на вашия сайт.

Нека разгледаме малък пример за сравнение на групирането на условен сайт и неговия конкурент.

Както можете да видите от таблицата, site.ru има една целева страница за всички ключови думи. При конкурент различни страници се класират за едни и същи заявки и заемат ТОП или близки до ТОП позиции. Въз основа на това можем да заключим, че групирането на site.ru трябва да бъде преразгледано, по-специално е необходимо да се създаде отделна страница за ключови фрази с думата „фасада“.

Качество на текста

Първото и най-важно нещо, на което трябва да обърнете внимание, когато анализирате текстове на конкуренти, не е количественият компонент (брой на срещания, дължина на текста и т.н.), а качественият или семантичен – колко полезна е информацията, какво предлага конкурентът и как го прави.

Нека разгледаме няколко примера.

Да приемем, че доставяте цветя и на главната страница в текста гарантирате тяхната свежест. Например, като това:

Услуга за доставка на цветясайт. enгарантира безопасността на букетите дори през студения сезон.

Ето пример от един от конкурентите:

Изгодно е да поръчате ароматни композиции от нас, защото ние гарантираме 100% гаранция за връщане на парите, ако свежестта на цветята е под съмнение.

Гаранцията на конкурент е обезпечена с пари, което е по-значимо от абстрактната гаранция.

Помислете за друг пример - текстът на страницата от категорията "керамични плочки" на онлайн магазин:

Този текст не носи никакво полезно семантично натоварване, твърда вода. Най-вероятно човекът, който е дошъл на сайта и взема решение за покупка, иска да знае предимствата на продукта и възможните конфигурации, вместо това получава безсмислен набор от знаци.

Сега нека разгледаме текста на един конкурент:

Този текст е по-полезен, защото накратко съобщава разликите между плочките и ви помага да разберете как да изберете правилната.

По този начин, сравнявайки текстовете на конкурентите с вашите собствени, можете да получите много полезна информация, която ще помогне на копирайтърите при съставянето на TOR.

Уместност на текстовете

Продължавайки темата за качеството на текстовете, не може да не се докосне до тяхната релевантност. Днес, за да е релевантен текстът, не е достатъчно само да включва ключови думи. За да увеличите уместността на страницата и в същото време да не направите текста спам, трябва да използвате думи, свързани с темата.

Когато оценява уместността на даден текст към заявка, търсачката анализира не само наличието на ключови думи, но и допълнителни думи, като по този начин определя значението на текста. Например, ако напишем текст за слон, тогава свързаните думи могат да бъдат разгледани: „хобот“, „бивни“, „природа“, „зоопарк“. Ако текстът за шахматната фигура е „слон“, тогава тези думи ще бъдат: „фигура“, „шах“, „кралица“ и т.н.

Можете да получите най-подходящия списък с думи за вашите нужди в текстовете на конкурентите. За да направите това, трябва да направите следните стъпки:

— Копираме всички текстове от ТОП-10 за желаната високочестотна заявка в различни текстови файлове.

- Премахваме служебни части на речта, препинателни знаци и числа от текстове (разгледани по-рано).

- Подредете думите в ред - използвайте функцията "търсене и замяна" с регулярни изрази. Заменете пространството с \n.

- След това трябва да приведете всички словоформи към нормалната форма на речник (лема). За да направите това, можете да използвате услугата https://tools.k50project.ru/lemma/. В полето въведете списък с думи от всеки файл поотделно и щракнете върху бутона "lemmetize and output as a csv table". Резултатът трябва да бъде 10 файла с леметизирани думи.

- Във всеки файл премахваме дублиращи се думи.

- Комбинирайте думи от файлове в един списък.

— Сега трябва да създадем честотен речник. За да направите това, добавете получения списък към услугата https://tools.k50project.ru/lemma/ и кликнете върху „изградете честотен речник под формата на CSV“.

- Нашият списък с думи е готов:

Ако честотата е 10, тогава тази дума е използвана на всичките 10 сайта, ако 8, тогава само на 8 и т.н. Препоръчваме да използвате най-често срещаните думи, но сред редките думи могат да се намерят интересни решения.

По такъв прост начин можете да получите списък с тематични думи за съставяне на TOR за копирайтъри.

Както можете да видите, конкурентите са много важен източник на информация, който може да ви помогне да оптимизирате по-добре сайтовете си. В тази статия разгледах далеч от всички аспекти и в бъдеще ще продължа да пиша за това какво е полезно и как можете да се научите от вашите конкуренти.

Абонирайте се за бюлетинТези алгоритми са предназначени за търсене в неизвестен по-рано текст и могат да се използват например в текстови редактори, средства за преглед на документи или уеб браузъри за търсене в рамките на страница. Те не изискват предварителна обработка на текст и могат да работят с непрекъснат поток от данни.

Линейно търсене

Просто последователно приложение на дадена метрика (например метриката на Левещайн) към думи от входния текст. Когато използвате метрика с ограничение, този метод ви позволява да постигнете оптимална производителност. Но в същото време, толкова повече к, толкова по-дълго се увеличава времето за работа. Асимптотична оценка на времето - O(kn).

Bitap (известен също като Shift-Or или Baeza-Yates-Gonnet и неговата модификация от Wu-Manber)

Алгоритъм bitapи различните му модификации най-често се използват за размито търсене без индексиране. Неговият вариант се използва например в помощната програма agrep на unix, която изпълнява функции, подобни на стандартния grep, но с поддръжка за грешки в заявката за търсене и дори предоставя ограничени възможности за използване на регулярни изрази.

За първи път идеята за този алгоритъм беше предложена от граждани Рикардо Баеза-ЙейтсИ Гастон Гонет, публикувайки свързана статия през 1992 г.
Оригиналната версия на алгоритъма се занимава само със замествания на знаци и всъщност изчислява разстоянието Хаминг. Но малко по-късно слънце уИ Уди Манберпредложи модификация на този алгоритъм за изчисляване на разстоянието Левещайн, т.е. донесе поддръжка за вмъквания и изтривания и разработи първата версия на помощната програма agrep, базирана на нея.






Резултатна стойност

Където к- брой грешки, j- индекс на знаците, с x - символна маска (в маската единичните битове са разположени на позиции, съответстващи на позициите на дадения символ в заявката).
Съвпадението или несъвпадението на заявката се определя от последния бит на получения вектор R.

Високата скорост на този алгоритъм се осигурява от битов паралелизъм на изчисленията - в една операция е възможно да се извършват изчисления на 32 или повече бита едновременно.
В същото време тривиалната реализация поддържа търсене на думи с дължина не повече от 32. Това ограничение се определя от ширината на стандартния тип международен(на 32-битови архитектури). Можете също да използвате видове с големи размери, но това може да забави алгоритъма до известна степен.

Въпреки факта, че асимптотичното време на работа на този алгоритъм O(kn)е същият като линейния метод, той е много по-бърз с дългите заявки и броя на грешките кнад 2.

Тестване

Тестването беше извършено върху текст от 3,2 милиона думи, средната дължина на думите беше 10.
Точно търсене
Време за търсене: 3562 ms
Търсете с помощта на метриката на Левенщайн
Време за търсене в k=2: 5728 ms
Време за търсене в k=5: 8385 ms
Търсете с помощта на алгоритъма Bitap с модификации на Wu-Manber
Време за търсене в k=2: 5499 мс
Време за търсене в k=5: 5928 ms

Очевидно простото търсене с помощта на метриката, за разлика от алгоритъма Bitap, е силно зависимо от броя на грешките. к.

Въпреки това, когато става въпрос за търсене на големи количества непроменен текст, времето за търсене може да бъде значително намалено чрез предварителна обработка на такъв текст, наричан още индексиране.

Алгоритми за размито търсене с индексиране (офлайн)

Характеристика на всички алгоритми за размито търсене с индексиране е, че индексът е изграден според речник, компилиран от изходния текст или списък със записи в база данни.

Тези алгоритми използват различни подходи за решаване на проблема – някои от тях използват редукция за точно търсене, други използват свойствата на метриката за изграждане на различни пространствени структури и т.н.

На първо място, на първата стъпка се изгражда речник от изходния текст, съдържащ думите и техните позиции в текста. Освен това можете да преброите честотите на думите и фразите, за да подобрите качеството на резултатите от търсенето.

Предполага се, че индексът, подобно на речника, е напълно зареден в паметта.

Тактически и технически характеристики на речника:

  • Изходен текст - 8,2 гигабайта материали от библиотеката на Мошков (lib.ru), 680 милиона думи;
  • Размер на речника - 65 мегабайта;
  • Брой думи - 3,2 милиона;
  • Средната дължина на думата е 9,5 знака;
  • Средна квадратна дължина на думата (може да бъде полезна при оценка на някои алгоритми) - 10,0 знака;
  • Азбука - главни букви A-Z, без E (за опростяване на някои операции). Думи, съдържащи не азбучни знаци, не са включени в речника.
Зависимостта на размера на речника от обема на текста не е строго линейна - до определен обем се формира основна рамка на думите, варираща от 15% при 500 хиляди думи до 5% при 5 милиона, а след това зависимостта се доближава до линейна , бавно намалява и достига 0,5% при 680 милиона думи. Следващото поддържане на растежа се осигурява в по-голямата си част от редки думи.

Примерен алгоритъм за разширение

Този алгоритъм често се използва в системи за проверка на правописа (т.е. проверки на правописа), където размерът на речника е малък или където скоростта не е основният критерий.
Тя се основава на свеждане на проблема с размитото търсене до проблема с точното търсене.

От оригиналната заявка се изгражда набор от "грешни" думи, за всяка от които след това се извършва точно търсене в речника.

Времето за работа силно зависи от броя k грешки и от размера на азбуката A, а в случай на използване на търсене в двоичен речник е:

Например, когато k = 1и думи с дължина 7 (например "Крокодил") в руската азбука, наборът от грешни думи ще бъде с размер около 450, тоест ще е необходимо да се направят 450 заявки за речник, което е напълно приемливо.
Но вече при k = 2размерът на такъв набор ще бъде повече от 115 хиляди опции, което съответства на пълно изброяване на малък речник, или 1/27 в нашия случай, и следователно времето за работа ще бъде доста голямо. В същото време не трябва да забравяме, че за всяка от тези думи е необходимо да се търси точно съвпадение в речника.

особености:
Алгоритъмът може лесно да бъде модифициран, за да генерира "грешни" варианти според произволни правила и освен това не изисква никаква предварителна обработка на речника и съответно допълнителна памет.
Възможни подобрения:
Възможно е да се генерира не целия набор от "грешни" думи, а само тези от тях, които е най-вероятно да се появят в реална ситуация, например думи, като се вземат предвид често срещани правописни или печатни грешки.

Този метод съществува от дълго време и е най-широко използваният, тъй като прилагането му е изключително просто и осигурява сравнително добра производителност. Алгоритъмът се основава на принципа:
„Ако дума А съвпада с дума Б, като се имат предвид няколко грешки, тогава с висока степен на вероятност те ще имат поне един общ подниз с дължина N.“
Тези поднизове с дължина N се наричат ​​N-грама.
По време на индексирането думата се разделя на такива N-грама и след това тази дума се включва в списъците за всеки от тези N-грама. По време на търсенето заявката също се разделя на N-грама, като за всеки от тях се търси последователно списък с думи, съдържащи такъв подниз.

Най-често използваните в практиката са триграми – поднизове с дължина 3. Изборът на по-голяма стойност на N води до ограничение на минималната дължина на думата, при което откриването на грешка вече е възможно.

особености:
Алгоритъмът на N-грам не намира всички възможни грешно изписани думи. Ако вземем например думата VOTKA и я разложим на триграми: IN т KA → VO тОТНОСНО тДА СЕ т KA - виждате, че всички те съдържат грешка T. По този начин думата "VODKA" няма да бъде намерена, тъй като не съдържа нито една от тези триграми и няма да попадне в списъците, съответстващи на тях. По този начин, колкото по-къса е дължината на една дума и колкото повече грешки съдържа, толкова по-голям е шансът тя да не попадне в списъците, съответстващи на N-грама на заявката, и да не присъства в резултата.

Междувременно методът N-gram оставя пълен обхват за използване на вашите собствени показатели с произволни свойства и сложност, но трябва да платите за това - когато го използвате, все още трябва последователно да изброявате около 15% от речника, което е доста много за големи речници.

Възможни подобрения:
Възможно е да се разделят хеш таблиците на N-грама по дължината на думите и по позицията на N-грама в думата (модификация 1). Как дължината на търсената дума и заявката не могат да се различават с повече от к, а позициите на N-грам в една дума могат да се различават с не повече от k. По този начин ще е необходимо да се провери само таблицата, съответстваща на позицията на този N-грам в думата, както и k таблици отляво и k таблици отдясно, т.е. Обща сума 2k+1съседни маси.

Можете допълнително да намалите размера на набора, необходим за сканиране, като разделите таблиците по дължина на думата и по подобен начин преглеждате само съседните таблици. 2k+1таблици (модификация 2).

Този алгоритъм е описан в статията на L.M. Boytsov. Хеширане на подписа. Тя се основава на доста очевидно представяне на "структурата" на думата под формата на битове, използвани като хеш (подпис) в хеш таблица.

По време на индексирането такива хешове се изчисляват за всяка от думите и съответният списък с думи от речника към този хеш се въвежда в таблицата. След това по време на търсенето се изчислява хеш за заявката и всички съседни хешове, които се различават от оригиналния с не повече от k бита, се сортират. За всеки от тези хешове се търси списъкът със съответните думи.

Процесът на изчисляване на хеш - на всеки бит от хеша се приписва група знаци от азбуката. Бит 1 на позиция ив хеш означава, че оригиналната дума съдържа знак от i-тоазбучни групи. Редът на буквите в думата е абсолютно без значение.

Премахването на един знак или няма да промени хеш стойността (ако все още има знаци от една и съща азбучна група в думата), или битът, съответстващ на тази група, ще се промени на 0. Когато бъде вмъкнат, по същия начин, всеки един бит ще бъде настроен на 1, или няма да има промени. При подмяна на знаци всичко е малко по-сложно - хешът може да остане непроменен изобщо, или да се промени на 1 или 2 позиции. При пермутиране не се случват никакви промени, тъй като редът на знаците при конструиране на хеша, както беше отбелязано по-рано, не се взема предвид. По този начин, за да покриете напълно k грешки, трябва да промените поне малко в хеша.

Времето на изпълнение, средно, с k "непълни" (вмъквания, изтривания и транспонирания, както и малка част от замествания) грешки:

особености:
Поради факта, че при замяна на един символ два бита могат да се променят наведнъж, алгоритъм, който прилага например изкривяване на не повече от 2 бита едновременно, всъщност няма да произведе пълния размер на резултатите поради липсата на значителна (в зависимост от съотношението на размера на хеша към азбуката) част от думите с две замествания (и колкото по-голям е размерът на хеша, толкова по-често подмяната на символа води до изкривяване на два бита наведнъж и толкова по-малко пълна резултатът ще бъде). Освен това този алгоритъм не позволява търсене по префикс.

BK дървета

дървета Буркхард-Келерса метрични дървета, алгоритмите за конструиране на такива дървета се основават на свойството на метриката да отговаря на неравенството на триъгълника:

Това свойство позволява на метриките да образуват метрични пространства с произволно измерение. Такива метрични пространства не са непременно евклидов, така, например, показателите ЛевещайнИ Дамерау-Левенщайнформа неевклидовпространство. Въз основа на тези свойства можете да изградите структура от данни, която търси в такова метрично пространство, което е дърветата на Barkhard-Keller.

Подобрения:
Можете да използвате способността на някои показатели за изчисляване на разстояние с ограничение, като зададете горна граница, равна на сумата от максималното разстояние до потомците на върха и полученото разстояние, което леко ще ускори процеса:

Тестване

Тестването беше извършено на лаптоп с Intel Core Duo T2500 (2GHz/667MHz FSB/2MB), 2Gb RAM, OS - Ubuntu 10.10 Desktop i686, JRE - OpenJDK 6 Update 20.

Тестването беше проведено с помощта на разстоянието на Дамерау-Левенщайн и броя на грешките k = 2. Размерът на индекса се посочва заедно с речника (65 MB).

Размер на индекса: 65 MB
Време за търсене: 320ms / 330ms
Пълнота на резултатите: 100%

N-грама (оригинал)
Размер на индекса: 170 MB
Време за създаване на индекса: 32 сек
Време за търсене: 71ms / 110ms
Пълнота на резултатите: 65%
N-грама (модификация 1)
Размер на индекса: 170 MB
Време за създаване на индекса: 32 сек
Време за търсене: 39ms / 46ms
Пълнота на резултатите: 63%
N-грама (модификация 2)
Размер на индекса: 170 MB
Време за създаване на индекса: 32 сек
Време за търсене: 37ms / 45ms
Пълнота на резултатите: 62%

Размер на индекса: 85 MB
Време за създаване на индекса: 0,6 s
Време за търсене: 55ms
Пълнота на резултатите: 56,5%

BK дървета
Размер на индекса: 150 MB
Време за създаване на индекс: 120 s
Време за търсене: 540ms
Пълнота на резултатите: 63%

Обща сума

Повечето индексирани алгоритми за размито търсене не са наистина сублинейни (т.е. имат асимптотично време на работа O(log n)или по-ниска) и тяхната скорост на работа обикновено зависи пряко от н. Въпреки това многобройните подобрения и усъвършенствания правят възможно постигането на достатъчно кратко време на работа дори при много големи обеми речници.

Съществуват и много по-разнообразни и неефективни методи, основани, наред с други неща, на адаптирането на различни техники и техники, които вече са използвани другаде, към дадена предметна област. Сред тези методи е адаптирането на префиксните дървета (Trie) към проблеми с размито търсене, което оставих без надзор поради ниската му ефективност. Но има и алгоритми, базирани на оригинални подходи, например алгоритъмът Маас-Новак, който, въпреки че има сублинейно асимптотично време на работа, е изключително неефективен поради огромните константи, скрити зад такава оценка на времето, които се проявяват под формата на огромен размер на индекса.

Практическото използване на алгоритмите за размито търсене в реалните търсачки е тясно свързано с фонетичните алгоритми, лексикалните алгоритми за изходна основа - подчертаване на основната част на различни словоформи на една и съща дума (например такава функционалност се предоставя от Snowball и Yandex mystem), като както и класиране въз основа на статистическа информация или използване на сложни сложни показатели.

  • Разстояние на Левещайн (с опция за изрязване и префикс);
  • Разстояние на Дамерау-Левенщайн (с опция за изрязване и префикс);
  • Bitap алгоритъм (Shift-OR / Shift-AND с модификации на Wu-Manber);
  • Примерен алгоритъм за разширяване;
  • N-грам метод (оригинал и с модификации);
  • Метод на хеширане на подпис;
  • BK-дървета.
Исках да направя кода лесен за разбиране и в същото време достатъчно ефективен за практическа употреба. Изстискването на последните сокове от JVM не беше част от задачите ми. наслади се.

Струва си да се отбележи, че в процеса на изучаване на тази тема измислих някои от моите собствени разработки, които ми позволяват да намаля времето за търсене с порядък поради умерено увеличаване на размера на индекса и известно ограничение в свободата на избор на показатели. Но това е съвсем различна история.


Дефиниция Примерни приложения Създаване на модел на n-gram език Изчисляване на n-gram вероятността Елиминиране на оскъдността на учебния корпус o Добавяне на изглаждане o Witten-Bell Discounting o Good-Turing Discounting o Katzs Backoff o Изтрита интерполация Оценка на n-gram езиков модел с използване ентропия Съдържание


N-gram (на английски N-gram) подпоследователност от N елемента на някаква последователност. Помислете за последователности от думи. Униграми котка, куче, кон,... Биграми малка котка, голямо куче, силен кон,... Триграми малка котка яде, голямо куче лае, силен кон тича,... Определение


Примери за приложни задачи Разпознаване на говор. Някои думи с различно изписване се произнасят еднакво. Задачата е да изберете правилната дума в контекста. Генериране на текстове по дадена тема. Пример: Yandex.Abstracts. Търсене на семантични грешки. Той се опитва да изясни - по отношение на синтаксиса, вярно, по отношение на семантиката, не. Опитва се да разбере - нали. опитът да разберете се среща в английските текстове много по-често, отколкото да се опитате да изчистите, което означава, че ако са налични статистически данни, можете да намерите и премахнете този вид грешка


Създаване на езиков модел от n-грами За решаване на изброените приложни проблеми е необходимо да се създаде езиков модел от N-грами. За да създадете модел, трябва: 1. Да изчислите вероятностите на n-grams в учебния корпус. 2. Коригирайте проблема с рядкост на корпуса с един от методите за заглаждане. 3. Оценете качеството на получения езиков модел на n-грами, използвайки ентропията.


Изчисляване на вероятността за N-грама (1) В учебния корпус определени n-грама се срещат с различни честоти. За всеки n-грам можем да преброим колко пъти се среща в корпуса. Въз основа на получените данни може да се изгради вероятностен модел, който след това да се използва за оценка на вероятността от n-грама в някакъв тестов корпус.


Изчисляване на вероятността за N-грама (2) Помислете за пример. Нека корпусът се състои от едно изречение: Те излязоха на пикник край басейна, после легнаха на тревата и погледнаха звездите. Нека изберем n-grams. Униграми: Те, измъкнати, от, ... Digrams: Те излязоха на пикник, избрани от, от, ... Триграми Те изхвърлиха, изкараха от, до басейна, ...


Изчисляване на вероятността за N-грама (3) Сега е възможно да се брои n-грама. Всички избрани би- и триграми се появяват в корпуса веднъж. Всички униграми, с изключение на думата the, също се срещат веднъж. Думата the се среща три пъти. Сега, когато знаем колко пъти се среща всеки n-грам, можем да изградим вероятностен модел на n-грама. В случай на униграми, вероятността за думата u може да се изчисли по формулата: Например, за думата вероятността ще бъде 3/16 (тъй като в корпуса има 16 думи, 3 от които са думата the) . Брой срещания на думата u в тренировъчния корпус. Те излязоха на пикник край басейна, след това легнаха на тревата и погледнаха звездите


1, вероятността се разглежда малко по-различно. Помислете за случая с биграмите: нека е необходимо да се изчисли вероятността за биграмата на пула. Ако разглеждаме всяка биграмна дума като някакво събитие, тогава вярвайки" title="(!LANG:N-gram изчисление на вероятността (4) За n-grams, където n>1, вероятността се изчислява малко по различен начин. Помислете за случая с биграми : нека е необходимо да се изчисли диграмата пула Ако разглеждаме всяка дума от диграма като някакво събитие, тогава вярвайки" class="link_thumb"> 9 !}Изчисляване на вероятността за N-грама (4) За n-грамове, където n>1, вероятността се изчислява малко по-различно. Помислете за случая с биграмите: нека е необходимо да се изчисли вероятността за биграмата на пула. Ако разглеждаме всяка биграмна дума като някакво събитие, тогава вероятността за набор от събития може да се изчисли по формулата: По този начин, вероятността за биграмата е пул:, където 1, вероятността се разглежда малко по-различно. Помислете за случая с биграмите: нека е необходимо да се изчисли вероятността за биграмата на пула. Ако разглеждаме всяка биграмна дума като някакво събитие, тогава вярвайки, че "> 1, вероятността се разглежда малко по различен начин. Помислете за случая с биграми: нека е необходимо да се изчисли вероятността на биграмата на групата. Ако разглеждаме всяка биграмна дума като някакво събитие, тогава вероятността за набор от събития може да се изчисли по формулата: По този начин, вероятността на биграмата е пул:, където "> 1, вероятността се изчислява малко по-различно. Помислете за случая с биграмите: нека е необходимо да се изчисли вероятността за биграмата на пула. Ако разглеждаме всяка биграмна дума като някакво събитие, тогава вярвайки" title="(!LANG:N-gram изчисление на вероятността (4) За n-grams, където n>1, вероятността се изчислява малко по различен начин. Помислете за случая с биграми : нека е необходимо да се изчисли диграмата пула Ако разглеждаме всяка дума от диграма като някакво събитие, тогава вярвайки"> title="Изчисляване на вероятността за N-грама (4) За n-грамове, където n>1, вероятността се изчислява малко по-различно. Помислете за случая с биграмите: нека е необходимо да се изчисли вероятността за биграмата на пула. Ако разглеждаме всяка дума от диграмата като някакво събитие, тогава вярваме"> !}


Изчисляване на вероятността за N-грама (5) Сега разгледайте изчисляването на вероятността за произволен n-грам (или изречение с дължина n). Разширявайки случая на биграмите, получаваме формулата на вероятността за n-грама По този начин, изчисляването на вероятността за изречение се свежда до изчисляване на условната вероятност на N-грамите, които съставляват това изречение:




Елиминиране на оскъдността на корпуса (1) Проблемът за прост (неизгладен) езиков модел на n-грами: за някои n-грама вероятността може да бъде силно подценена (или дори нула), въпреки че в действителност (в тестовия корпус) тези n-grams могат да се появят доста често. Причина: ограничен учебен корпус и неговата специфика. Решение: като намалите вероятността за някои n-грама, увеличете вероятността за тези n-грама, които не са се появили (или са се срещали доста рядко) в учебния корпус.




Корпусно елиминиране на рядкост (3) Следните концепции се използват в алгоритмите за елиминиране на рядкост: Типове – различни думи (поредици от думи) в текста. Токените са всички думи (поредици от думи) в текста. Излязоха на пикник край басейна, след това се отпуснаха на тревата и гледаха звездите - 14 вида, 16 жетона





Добавяне на едно изглаждане (4) Методът предизвиква силна грешка в изчисленията (например на предишния слайд беше показано, че за думата китайски броят на биграмите е намален 8 пъти). Тестовете показват, че неизгладеният модел често показва по-точни резултати. Следователно методът е интересен само от теоретична гледна точка.


Отстъпка на Witten-Bell (1) Въз основа на проста идея: използвайте данни за n-грамите, срещащи се в учебния корпус, за да оцените вероятността от липсващи n-грами. Идеята на метода е взета от алгоритмите за компресия: разглеждат се два типа събития - те срещнаха нов символ (тип) и те срещнаха символ (токен). Формула за вероятност за всички липсващи n-грама (тоест вероятността да се срещне n-грам в тестовия корпус, който не е бил в обучителния корпус): N е броят на жетоните в учебния корпус, T е броят на типовете които вече са срещани в учебния корпус






Отстъпка на Witten-Bell (4) =>=> =>"> =>"> =>" title="(!LANG:Witten-Bell Discounting (4) =>=>"> title="Отстъпка на Witten-Bell (4) =>=>"> !}




Отстъпка по Гуд-Тюринг (1) Идея: За n-грама, които се появяват нула пъти (c пъти), резултатът е пропорционален на броя на n-грамите, които се появяват веднъж (c + 1 пъти). Помислете за пример: Да предположим, че са уловени 18 риби. Общо бяха уловени 6 различни вида, а от три вида е уловен само един представител. Трябва да намерим вероятността следващата риба да принадлежи към нов вид. Възможни са общо 7 вида (6 вида вече са уловени).








Katzs Backoff (2) Коефициентът α е необходим за правилното разпределение на остатъчната вероятност на N-грама в съответствие с разпределението на вероятностите на (N-1)-грама. Ако не въведете α, оценката ще бъде грешна, т.к равенството няма да бъде изпълнено: Изчислението на α е дадено в края на отчета. Оценка на езиков модел с помощта на ентропия (1) Ентропията е мярка за несигурност. С помощта на ентропията може да се определи най-подходящият езиков модел на N-грами за дадена приложна задача. Формула за двоична ентропия: Пример: Изчислете ентропията на тест за хвърляне на монети. Отговор: 1 бит, при условие че резултатите от експеримента са еднакво вероятни (и двете страни изпадат с вероятност 1/2).




Оценка на езиковия модел с помощта на ентропия (3) Кръстосаната ентропия се използва за сравняване на различни езикови модели: Колкото по-близо е стойността на кръстосаната ентропия H(p,m) до реалната ентропия H(p), толкова по-добър е езиковият модел: В нашия случай H(p ) е ентропията на тестовия корпус. m(w) – езиков модел (напр. N-грам модел)


Оценка на езиков модел с помощта на ентропия (4) Съществува и друг метод за оценка на качеството на езиков модел, базиран на т.нар. индикатор за свързаност (недоумение). Идея: Изчислете вероятността на целия тестов корпус. По-добрият модел ще покаже по-голяма вероятност. формула за недоумение: По този начин, колкото по-малка е недоумението, толкова по-добър е моделът. Объркаността може да се тълкува като средния брой думи, които могат да дойдат след определена дума (т.е. колкото повече недоумение, толкова по-голяма е двусмислието и следователно, толкова по-лош е езиковият модел). Връзка между недоумението и двоичната ентропия:


Оценка на езиков модел с помощта на ентропия (5) Като пример, разгледайте стойностите на недоумението за някакъв корпус, получени с помощта на обучени модели на униграми, биграми и триграми: В случай на триграми недоумението е най-малкото, т.к. недвусмислеността се улеснява от най-дългата история на всички модели (равна на 2) при изчисляване на условните вероятности на триграмите. UnigramBigramTrigram Недоумение


Искам да внедря някои n-gram приложения (за предпочитане в PHP).

Какъв тип n-грама е по-подходящ за повечето цели? Ниво на дума или ниво на знаци n-gram ниво? Как може да бъде внедрен n-граматичен токенизатор в PHP?

Първо, бих искал да знам какво представляват N-грамовете. Правилно е? Ето как разбирам n-grams:

Предложение: "Живея в Ню Йорк."

бирами на ниво дума (2 за n): "# I", "I live", "live in", "in New York", "NY #"

ниво на знаци birams (2 за n): "#I", "I #", "#l", "li", "iv", "ve", "e #", "#i", "in", "n#", "#N", "NY", "Y#"

След като имате този масив от n-грам части, хвърляте дубликати и добавяте брояч за всяка част, която определя честотата:

биграми на ниво дума:

биграми на ниво символ:

Правилно ли е?

Също така бих искал да знам повече за това какво можете да правите с n-grams:

  • Как мога да открия езика на текст с помощта на n-грама?
  • Възможно ли е да се прави машинен превод с помощта на n-grams, дори ако нямате двуезичен корпус?
  • Как да създадете филтър за спам (спам, шунка)? Комбинирайте n-grams с байесов филтър?
  • Как мога да намеря тема? Например: има ли текст за баскетбол или кучета? Моят подход (направете следното със статията в Уикипедия за "кучета" и "баскетбол"): начертайте n-gram векторите за двата документа, нормализирайте ги, изчислете разстоянието Манхатън/Евклид, колкото по-близо е резултатът до 1, толкова по-висок е приликата ще бъде

Какво мислите за моята кандидатура, особено последната?

Надявам се, че можете да ми помогнете. Благодаря предварително!

2 отговора

Word n-gram обикновено ще бъде по-полезен за повечето приложения за анализ на текст, които споменахте, с възможно изключение на езиковата дефиниция, където нещо като триграми на знаци може да даде по-добри резултати. Ефективно ще създадете вектор от n-грама за текстовото тяло на всеки език, който ви интересува, и след това ще сравните честотите на триграмите във всеки корпус с тези в документа, който класифицирате. Например, триграмата the вероятно ще се появява много по-често на английски, отколкото на немски, и ще осигури известно ниво на статистическа корелация. След като имате n-gram документи, имате избор между много алгоритми за по-нататъшен анализ, Baysian филтри, N най-близък съсед, машини за поддържащи вектори и т.н.

От приложенията, които споменахте, машинният превод е може би най-претенциозният, тъй като n-грамите сами по себе си няма да ви отведат много далеч по пътя. Преобразуването на входен файл в n-gram представяне е просто начин да поставите данните във формат за по-нататъшен анализ на функции, но тъй като губите много контекстна информация, това може да не е полезно за превод.

Едно нещо, което трябва да се отбележи, е, че не е достатъчно да създадете вектор за един документ и вектор за друг документ, ако размерите не съвпадат. Тоест първият запис във вектора не може да бъде в един документ и е в друг, или алгоритмите няма да работят. В крайна сметка ще получите вектори като , тъй като повечето документи няма да съдържат повече от n-грамите, които ви интересуват. Тази "подплата" също изисква да определите предварително кои ngram ще включите в анализа си. Често това се изпълнява като алгоритъм за два прохода, за да се реши първо статистическата значимост на различните n-грами, за да се реши какво да се запази. Google "избор на функции" за повече информация.

Базирани на думи n-grams плюс поддръжка за векторни машини е чудесен начин да дефинирате тема, но за да подготвите класификатор, ви е необходим голям корпус от текст, предварително класифициран в теми "по тема" и "извън темата". Ще намерите голям брой изследователски статии, обясняващи различни подходи към този проблем на сайт като citeseerx. Не бих препоръчал подхода на евклидовото разстояние към този проблем, тъй като той не претегля отделни n-грама въз основа на статистическа значимост, така че два документа, които включват , a , is и of ще се считат за по-добро съвпадение от два документа, който включваше Байсиан. Премахването на стоп думите от вашите n-грама, представляващи интерес, би подобрило това малко.

Прав си за определението за n-грамове.

Можете да използвате n-gram на ниво дума за приложения от типа на търсене. n-грамите на ниво символ могат да се използват повече за анализиране на самия текст. Например, за да идентифицирам езика на даден текст, бих използвал честотите на буквите спрямо установените езикови честоти. Тоест текстът трябва приблизително да съответства на честотата на поява на буквите на този език.

n-граматичният токенизатор за думи в PHP може да се направи с помощта на strtok:

За знаци използвайте разделяне:

След това можете просто да разделите масива, както желаете, на произволен брой n-грама.

Байесовите филтри трябва да бъдат обучени за използване като филтри за спам, които могат да се използват във връзка с n-grams. Трябва обаче да му дадете много принос, за да го накарате да учи.

Последният ви подход звучи прилично, тъй като научава контекста на страницата... все още е доста трудно да се направи обаче, но n-grams изглеждат като добра отправна точка за това.