MorphoDiTa - slovní druhy

V minulé části jsme lokálně spustili MorphoDiTu a nechali ji zpracovat text "Investor radí, jak na dvoucifernou inflaci.", z čehož vznikl výstup ve formátu XML:

output.xml
<sentence>
    <token lemma="investor" tag="NNMS1-----A----">Investor</token>
    <token lemma="radit_:T" tag="VB-S---3P-AA---">radí</token>
    <token lemma="," tag="Z:-------------">,</token>
    <token lemma="jak-3" tag="Db-------------">jak</token>
    <token lemma="na-1" tag="RR--4----------">na</token>
    <token lemma="dvouciferný" tag="AAFS4----1A----">dvoucifernou</token>
    <token lemma="inflace" tag="NNFS4-----A----">inflaci</token>
    <token lemma="." tag="Z:-------------">.</token>
</sentence>

Ten si nyní zpracuje v Pythonu a začneme pomalu pracovat na uživatelsky příjemné knihovně pro práci s MorphoDiTou.

Práce s XML

I když MorphoDiTa umožňuje i export do čistého textu, kde je výstupem jedno slovo na jeden řádek s lemmou a tagem oddělenými tabulátory, budeme používat XML, které přeci jen dodržuje určitou strukturu a má dobrou podporu v Pythonu.

Dobře nám poslouží modul xml, konkrétně xml.etree.ElementTree. Jako vstupní parametr přijímá soubor s XML výstupem a umí vrátit list všech elementů, které se nacházejí v daném výstupu - v našem případě list nodů <sentence>.

Náš XML parser začneme rovnou psát tak, aby se dal pohodlně použít i v budoucnu, proto si vytvoříme v naší kořenové složce modul morphy.xmlparser (soubor xmlparser.py ve složce morphy) a v něm si vytvoříme třídu XmlParser:

xmlparser.py
import xml.etree.ElementTree as ET

from .entities import Sentence, Token

class XmlParser:
    # Nazev elementu obsahujici vety.
    SENTENCES_PATH = './sentence'
    
    def __init__(self, xml_file) -> None:
        self._xml_file = xml_file
        # Nacteni XML soubor.
        self._tree = ET.parse(self._xml_file)
        # Ziskani korene stromu.
        self._root = self._tree.getroot()

        # Zpracovani jednotlivych vet ve vystupu
        self.sentences = self._parse_sentences(self._root)
        
        
    def _parse_sentences(self, root):
        id = 1
        sentences = []
        # Iterace pres vsechny vety
        for s in root.findall(self.SENTENCES_PATH):
            sentence = Sentence(id)
            
            # Iterace pres vsechna slova ve vete
            for t in s:
                token = Token()
                token.token = t.text
                token.lemma = t.attrib['lemma']
                token.tag = t.attrib['tag']
                
                sentence.add_token(token)
            
            sentences.append(sentence)
            id = id + 1
        return sentences

Vedle xml modulu importujeme i dvě entity - Sentence a Token.

Další kapitoly
  • MorphoDiTa - slovní druhy
  • MorphoDiTa - zpracování textu
  • MorphoDiTa - představení