yargy
1
2from yargy import Parser, rule, and_, not_
3from yargy.interpretation import fact
4from yargy.predicates import gram
5from yargy.relations import gnc_relation
6from yargy.pipelines import morph_pipeline
7
8
9def test_person():
10Name = fact(
11'Name',
12['first', 'last'],
13)
14Person = fact(
15'Person',
16['position', 'name']
17)
18
19LAST = and_(
20gram('Surn'),
21not_(gram('Abbr')),
22)
23FIRST = and_(
24gram('Name'),
25not_(gram('Abbr')),
26)
27
28POSITION = morph_pipeline([
29'управляющий директор',
30'вице-мэр'
31])
32
33gnc = gnc_relation()
34NAME = rule(
35FIRST.interpretation(
36Name.first
37).match(gnc),
38LAST.interpretation(
39Name.last
40).match(gnc)
41).interpretation(
42Name
43)
44
45PERSON = rule(
46POSITION.interpretation(
47Person.position
48).match(gnc),
49NAME.interpretation(
50Person.name
51)
52).interpretation(
53Person
54)
55
56parser = Parser(PERSON)
57
58match = parser.match('управляющий директор Иван Ульянов')
59assert match
60
61assert match.fact == Person(
62position='управляющий директор',
63name=Name(
64first='Иван',
65last='Ульянов'
66)
67)
68