N-gramy jsou souvislé části textu sestávající z n slov. 1-gramy neboli unigramy jsou jednotlivá slova, 2-gramy neboli bigramy jsou dvojslovné fráze, 3-gramy (trigramy) trojslovné fráze atd. Ve větě Skákal pes přes oves jsou tedy unigramy slova skákal, pes, přes a oves. Její bigramy jsou: skákal pes, pes přes a přes oves. Trigramy má jen dva: skákal pes přes a pes přes oves.
Analýza pomocí n-gramů se dělá tak, že se v textu najdou všechny unikátní n-gramy a spočítá se jejich četnost. Pak se má za to, že n-gramy, které se v textu vyskytují častěji, reprezentují jeho téma lépe než n-gramy, které se vyskytují méně často.
Pokud bychom aplikovali analýzu n-gramů na předešlé dva odstavce, mohl by výstup vypadat např. takto:
Aby to fungovalo, nezařazují se do statistiky unigramů a někdy i vícečetných n-gramů tzv. stopslova či stopfráze, tj. slova nebo fráze, které se v daném jazyce přirozeně vyskytují velmi často a nenesou konkrétnější význam. Mezi typická stopslova patří předložky, spojky nebo pomocná slovesa.
N-gramy se používají už docela dlouho především k rychlému nalezení hlavních témat delších textů. Poslední dobou se uplatňují také v umělé inteligenci jako klasifikátory vstupních textů pro strojové učení, protože se s nimi některým algoritmům lépe a jednoznačněji pracuje než s celými texty.
Mně n-gramy nejčastěji pomáhají v analýze klíčových slov pro SEO a vlastně při tom postupuji trochu podobně jako algoritmy strojového učení, byť machine learning jako takový nepoužívám. Tento postup ještě dále podrobněji popíšu.
Kromě analýzy klíčových slov ale využívám n-gramy i v několika dalších oblastech.
Už dříve jsem popsal, jak dělám klasifikační analýzy klíčových slov. Ve zkratce: vezmu seznam hledaných dotazů z keyword toolu nějakého vyhledavače nebo z Marketing Mineru a každý dotaz zařadím do jedné či více škatulek, např. podle toho, jaký produkt jím lidé hledají, jakými vlastnostmi hledanou věc upřesňují, zda ji hledají v nějaké zeměpisné lokalitě atd.
Dotazů, které takto musím klasifikovat, bývají v nejlepším případě jen stovky, ale častěji to jsou tisíce nebo desetitisíce a někdy i statisíce. Takové počty nejde klasifikovat ručně po jednom. Proto si vždycky najdu slova či fráze, které jsou společná velké skupině dotazů a zároveň celou tuto skupinu zařazují do určité škatulky.
A právě k tomu, abych našel taková charakteristická slova či fráze, mi pomáhají n-gramy. Ukážu to na příkladu.
Chci analyzovat, jak lidé hledají ve vyhledavačích čaj. V prvním kroku tedy vytáhnu z nástroje Skliku, Google Ads nebo z Marketing Mineru všechny dotazy, které obsahují slovo čaj a několik pojmenování konkrétních čajů.
V druhém kroku sestavím z těchto dotazů n-gramy, které mohou vypadat např. takto (výstup je zkrácený):
Z toho na první pohled vidím, že lidé kromě samotného čaje často hledají i něco na čaj, konkrétně konvice, sítko nebo hrnky. Automaticky tedy mohu všechny dotazy obsahující frázi na čaj zařadit do škatulky Čajové příslušenství. Obdobně mohu postupovat s „barvami“ čaje, zeměmi původu apod.
Přestože tento postup analýzu klíčových slov podstatně zrychluje, má i své problémy. N-gramy se samy o sobě zejména v češtině neumí popasovat s texty bez diakritiky (nesloučí slova čaj a caj), ohýbáním slov (nesloučí slova čaj a čaje) a různým pořadím slov ve frázích se stejným významem (černý čaj vs. čaj černý).
Dva z těchto problémů řeším tím, že všechny dotazy ještě před n-gramovou analýzou převedu na tzv. normalizovaný tvar – automatizovaným nástrojem v Google Sheets do slov doplním chybějící diakritiku a dotazy lišící se jen pořadím slov sjednotím na to pořadí, které se hledá nejčastěji. Poslední problém, ohýbání slov neboli lematizaci, bych sice někdy rád řešil také, ale žádný dostupný nástroj na to neznám a většinou to ani nepotřebuji. Ono by to bylo i metodicky problematické, protože ohýbání v češtině často mění význam frází.
Popsané metodě občas někdo vytýká i to, že pracuje jen s frekvencí n-gramů v dotazech a ignoruje hledanost dotazů. To je ale trochu nepochopení účelu této metody. Jde v ní hlavně o to, aby ušetřila práci s klasifikací dotazů, a pracnost stoupá počtem dotazů, nikoli jejich hledaností. A pokud je výjimečně účel analýzy jiný, mám interní nástroj, který místo četnosti počítá s nějakými jinými číselnými hodnotami, které mají vstupní texty předem přiřazené a které mohou reprezentovat právě jejich hledanosti.
Kromě n-gramů se někdy hodí i tzv. skipgramy. Jedná se o víceslovné n-gramy, které ale nevyžadují těsnou návaznost a pořadí slov. Když se vrátím k prvnímu příkladu skákal pes přes oves, pak nad rámec normálních n-gramů by z této věty šly sestavit mj. tyto skipgramy: skákal přes, skákal oves, pes oves, pes skákal nebo skákal přes oves.
Jak vyplývá z jejich podstaty, skipgramů vždycky dostanete o dost víc než n-gramů, takže vás většinou budou zajímat jen ty s hodně velkou frekvencí. Obecně se hodí spíš pro kratší segmenty textů, kde jich nevzniká tolik. V dotazech z vyhledavačů nebo v titulcích stránek ale často odhalí něco, co obyčejné n-gramy neukážou.
Pro rychlé sestavení základních n-gramů z menšího počtu kratších textů jsme pro nás i naše klenty vyvinuli jednoduchý on-line nástroj N-grams. Zkopírujete do něj vstupní texty, třeba seznam vyhledávacích dotazů a dostanete kompletní frekvenční tabulku.
Nástroj pracuje jen na klientovi (ve webovém prohlížeči) a bleskově zvládá tisíce textů dlouhých jednotky slov. Větší počet textů nebo hodně dlouhé texty může zpracovávat pomaleji a třeba stovky tisíc textů by asi spíš nezvládl. Záleží ale jen na paměti a výkonu vašeho počítače.
Důležité je, že jednotlivé texty musejí být odděleny odřádkováním. N-gramy se vyhodnocují jen uvnitř jednotlivých textů, přes hranici odřádkování nejdou. To ukazují i příklady, které si můžete v nástroji na dvě kliknutí vyzkoušet.