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:
<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
:
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
.