Automatické generování klíčových slov

Onehdá jsem řešil problém, jak automaticky generovat tagy ke článkům, které by určovaly, čeho se článek týká. Prostě že „něčemu“ předhodím nějaký text a script bude schopen mi z toho nějak rozumně vygenerovat klíčová slova.

První a nejjednodušší myšlenkou je rozdělit text na jednotlivá slova. Problém nastává v podstatě ihned. Když si vezmeme titulek článku „Zeman: Chci být znovu prezidentem a budu kandidovat„, dostaneme jako klíčová slova vše, včetně slov jako „být“ nebo „a„, což nejsou nijak směrodatná klíčová slova.

Na řadu přichází můj další myšlenkový pochod – brát v potaz pouze slova začínající velkým písmenem. Opět ale narážíme na problém, resp. rovnou dva. Vždy bude použito první slovo z titulku, protože bude začínat velkým písmenem a některá další podstatná klíčová slova budou vynechána, jelikož jsou unitř věty a nejedná se o vlastní jména. Z našeho modelového titulku o kandidatuře Zemana se tedy dostáváme jen na klíčové slovo „Zeman„. To už má sice mnohem lepší vypovídající hodnotu, ale pořád to není ono a v záběru více titulků to stačit nebude. Jak se zdá, bez nějakého lexikálního rozboru se asi neobejdeme…

Zde jsem využil znalosti jednoho kolegy, který mi doporučil službu MorphoDiTa. Podobných služeb se dá jistě na internetu najít více, ale velká výhoda MorphoDiTy je v tom, že umí pracovat s českým textem. Otevírám tedy online demo a zkouším vložit náš modelový titulek.

To je ono! Vedle otagování jednotlivých slov je nejpozdstatnější věcí, že dokáže určit podstatná slova a co víc, vrátit k nim i jejich první pád. Online demo tedy potvrdilo, že MorphoDiTa dokáže přesně to, co potřebujeme, nicméně my potřebujeme titulky zpracovávat programově. Naštěstí ani zde nás nenechá ve štychu a nabízí přehledné API.

Práce s API v Pythonu je otázka pár řádek kódu:

V odpovědi dostáváme vše, co budeme potřebovat pro další práci a v podstatě ty stejné informace, které nám poskytne online demo:

Naše otagovaná slova máme máme v listu  result , tak si ho jdeme zpracovat. Nás zajímají pouze podstatná jména, která poznáme podle toho, že  tag začíná  NN , takže je vyřeším jednoduchou funkcí, které předhodíme tag:

Během iterování výsledků je potřeba počítat s tím, že list  result je listem listů podle vět. Je tedy třeba vnořený cyklus.

Tímto tedy máme vytažená pouze podstatná jména. Pomalu se blížíme k cíli. Naše kýžena podstatná jména v první pádu nyní můžeme najít pod klíčem  lemma . Ale! Některá, většinou „méně-písmenná“ podstatná jména si s sebou táhnou ještě nechtěný číselný postfix za pomlčkou. Neptejte se mě proč, lexikální rozbor není úplně moje parketa. Nicméně musíme si nadefinovat ještě jednu funkci, která nám první pád očistí:

Pokud by někdy nastalo, že číselný postfix bude mít slovo s pomlčkou, která je žádoucí (např. „Frýdek-Místek„, který sice postfix nemá, ale pro demonstraci myšlenky stačí), je potřeba vypustit jen poslední část oddělenou pomlčkami. Pokud tedy aplikujeme i poslední funkci a necháme si vypsat výsledek, dostáváme z titulku „Zeman: Chci být znovu prezidentem a budu kandidovat“ dvě relevantní klíčová slova – „Zeman“ a „prezident„.

Výsledný funkční script najdete na mém GitHub Gist a budu rád, pokud se do komentářů podělíte o zkušenosti, případně vylepšení.

Mohlo by se vám líbit...

komentáře 2

  1. Lukáš Banič napsal:

    Můžeš zpracovat celý text a vybrat slova s vysokou TF-IDF hodnotou (viz wiki) – ta znamená, že slovo je napříč všechny články spíš zřídkavé, ale v článku X se vyskytuje často. Třeba slovo „jablko“ se ve většině článků nevyskytuje, zato v článcích o jabkach se může vyskytovat i 10-krát.

    Když použiješ detektor pojmenovaných entit, můžeš mít jako klíčová „slova“ i víceslovní výrazy jako např. Miloš_Zeman nebo Ustí_nad_Labem. Mrkni třeba na NameTag (http://ufal.mff.cuni.cz/nametag).

  1. 11.1.2018

    […] tagů jsem rozebíral již v článku Automatické generování klíčových slov, proto jen zmíním, že je k tomu použita […]

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *