natasha / yargy

Rule-based facts extraction for Russian language
MIT License
315 stars 40 forks source link

Ограничения предикатов не действуют при интерпретации #67

Open abaula opened 5 years ago

abaula commented 5 years ago
FPerson = fact(
    'Person',
    ['first', 'last']
)
GName = gram('Name')
GSurn = gram('Surn')

RLastName = and_(GSurn, is_single()).interpretation(
    FPerson.last.inflected()
)
RFirstName = and_(GName, is_single()).interpretation(
    FPerson.first.inflected()
)

RPerson = rule(or_(
    RFirstName, RLastName
    #RLastName, RFirstName
    )).interpretation(
    FPerson
)

show_matches(RPerson, ["Иванов", "Иван"])

имеем:

Person(first='иванов', last=None) Person(first='иван', last=None)

если взглянуть на морфер, то видно, что "Иванов" не имеет единственного числа для gram('Name'), тем не менее правило RFirstName срабатывает.

list(tokenizer("Иванов Иван"))

[MorphToken('Иванов', [0, 6), 'RU', [Form('иванов', Grams(NOUN,Sgtm,Surn,anim,masc,nomn,sing)), Form('иванов', Grams(ADJF,Poss,masc,nomn,sing)), Form('иванов', Grams(ADJF,Poss,accs,inan,masc,sing)), Form('иван', Grams(NOUN,Name,anim,gent,masc,plur)), Form('иван', Grams(NOUN,Name,accs,anim,masc,plur))]), MorphToken('Иван', [7, 11), 'RU', [Form('иван', Grams(NOUN,Name,anim,masc,nomn,sing))])]