-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkrvety.pm
61 lines (55 loc) · 2.12 KB
/
krvety.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# Model krátkých vět na základě vzorů morfologických značek.
package krvety;
use utf8;
use rozebrat;
#------------------------------------------------------------------------------
# Zjistí, zda vzor morfologických značek ve větě odpovídá některému vzoru
# známému z trénovacích dat. Pokud ano, zjistí syntaktickou strukturu
# odpovídající tomuto vzoru a vrátí ji. Pokud ne, zavolá funkci na běžný rozbor
# věty. Výslednou strukturu vrací zabalenou do hashe %stav, kvůli kompatibilitě
# s jinými funkcemi na rozbor věty.
#------------------------------------------------------------------------------
sub rozebrat
{
my $anot = shift; # odkaz na pole hashů
my $vzorstrom = shift; # odkaz na hash hashů {vzor}{strom}
# Zatím globální proměnné.
my $konfig = \%main::konfig;
# Odkaz na výstupní hash.
my $stav;
# Sestavit morfologický vzorec věty.
my $vzor;
for(my $i = 1; $i<=$#{$anot}; $i++)
{
$vzor .= "~" if($i>1);
my $znacka = $anot->[$i]{uznacka};
$vzor .= $znacka;
}
# Ke vzorci najít nejpravděpodobnější stromovou strukturu.
my $strom = $vzorstrom->{$vzor}{strom};
my $cetnost_stromu = $vzorstrom->{$vzor}{cetnost};
my $cetnost_vzoru = $vzorstrom->{$vzor}{celkem};
# Nepřesvědčivá četnost, neznámý vzor => zpracovat klasicky.
if($cetnost_vzoru==0 || $cetnost_stromu/$cetnost_vzoru<0.5)
{
# Pokud takový vzorec neznáme, rozebrat větu klasicky.
$stav = rozebrat::rozebrat_vetu($anot);
}
else
{
# Naprosto nestatistický zásah. Tyto věty (např. "Karel Rožánek, Praha") jsou v PDT anotovány několika
# způsoby, a navíc v trénovacích datech převažuje jiný způsob než v testovacích. Zde mám ten z testovacích.
if($vzor eq "NY1~N1~Z,~N1")
{
$strom = "2,3,0,3";
}
my @rodic = split(/,/, $strom);
# Přidat prázdný nultý prvek, ten ve vzorových stromech není.
unshift(@rodic, -1);
my %stav;
$stav{rodic} = \@rodic;
$stav = \%stav;
}
return $stav;
}
1;