from yargy import Parser, rule, and_ from yargy.predicates import gram, is_capitalized, dictionary GEO = rule( and_( gram('ADJF'), # так помечается прилагательное, остальные пометки описаны в # http://pymorphy2.readthedocs.io/en/latest/user/grammemes.html is_capitalized() ), gram('ADJF').optional().repeatable(), dictionary({ 'федерация', 'республика' }) ) parser = Parser(GEO) text = ''' В Чеченской республике на день рождения ... Донецкая народная республика провозгласила ... Башня Федерация — одна из самых высоких ... ''' for match in parser.findall(text): print([_.value for _ in match.tokens]) from yargy import Parser from yargy.predicates import gram from yargy.pipelines import morph_pipeline from yargy.interpretation import fact from IPython.display import display Person = fact( 'Person', ['position', 'name'] ) Name = fact( 'Name', ['first', 'last'] ) POSITION = morph_pipeline([ 'премьер министр', 'президент' ]) NAME = rule( gram('Name').interpretation( Name.first.inflected() ), gram('Surn').interpretation( Name.last.inflected() ) ).interpretation( Name ) PERSON = rule( POSITION.interpretation( Person.position.inflected() ), NAME.interpretation( Person.name ) ).interpretation( Person ) parser = Parser(PERSON) text = ''' 12 марта по приказу президента Владимира Путина ... ''' for match in parser.findall(text): display(match.fact) from yargy.tokenizer import MorphTokenizer tokenizer = MorphTokenizer() text = '''Ростов-на-Дону Длительностью 18ч. 10мин. Яндекс.Такси π ≈ 3.1415 1 500 000$ http://vk.com ''' for line in text.splitlines(): print([_.value for _ in tokenizer(line)]) tokenizer = MorphTokenizer() list(tokenizer('марки стали')) from yargy import and_, not_ from yargy.tokenizer import MorphTokenizer from yargy.predicates import is_capitalized, eq tokenizer = MorphTokenizer() token = next(tokenizer('Стали')) predicate = is_capitalized() assert predicate(token) == True predicate = and_( is_capitalized(), not_(eq('марки')) ) assert predicate(token) == True from pymorphy2.shapes import is_roman_number from yargy.parser import Context from yargy.tokenizer import Tokenizer from yargy.predicates import custom tokenizer = Tokenizer() token = next(tokenizer('XL')) predicate = custom(is_roman_number, types='LATIN') predicate = predicate.activate(Context(tokenizer)) # проверяется, что tokenizer поддерживает тип 'LATIN' assert predicate(token) == True token = next(tokenizer('XS')) assert predicate(token) == False from yargy import or_, rule from yargy.predicates import normalized RULE = or_( rule(normalized('dvd'), '-', normalized('диск')), rule(normalized('видео'), normalized('файл')) ) from yargy import Parser from yargy.pipelines import morph_pipeline RULE = morph_pipeline([ 'dvd-диск', 'видео файл', 'видеофильм', 'газета', 'электронный дневник', 'эссе', ]) parser = Parser(RULE) text = 'Видео файл на dvd-диске' for match in parser.findall(text): print([_.value for _ in match.tokens]) from yargy import rule, or_ KEY = or_( rule('р', '.'), rule('размер') ).named('KEY') VALUE = or_( rule('S'), rule('M'), rule('L'), ).named('VALUE') SIZE = rule( KEY, VALUE ).named('SIZE') SIZE.normalized.as_bnf from yargy.predicates import in_ VALUE = rule( in_('SML') ).named('VALUE') SIZE = rule( KEY, VALUE ).named('SIZE') SIZE.normalized.as_bnf from yargy import forward EXPR = forward() EXPR.define(or_( rule('a'), rule('(', EXPR, '+', EXPR, ')') ).named('EXPR')) EXPR.normalized.as_bnf from yargy import not_ from yargy.predicates import eq WORD = not_(eq('»')) TEXT = forward() TEXT.define(or_( rule(WORD), rule(WORD, TEXT) )) TITLE = rule( '«', TEXT, '»' ).named('TITLE') TITLE.normalized.as_bnf TITLE = rule( '«', not_(eq('»')).repeatable(), '»' ).named('TITLE') TITLE.normalized.as_bnf parser = Parser( or_( PERSON, TITLE ) ) text = 'Президент Владимир Путин в фильме «Интервью с Путиным» ..' for match in parser.findall(text): print([_.value for _ in match.tokens]) match = parser.match('Президент Владимир Путин') print([_.value for _ in match.tokens]) match = parser.match('Президент Владимир Путин 25 мая') print(match) from IPython.display import display from yargy.predicates import ( lte, gte, dictionary ) MONTHS = { 'январь', 'февраль', 'март', 'апрель', 'мая', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь' } MONTH_NAME = dictionary(MONTHS) MONTH = and_( gte(1), lte(12) ) DAY = and_( gte(1), lte(31) ) YEAR = and_( gte(1900), lte(2100) ) DATE = or_( rule(DAY, MONTH_NAME, YEAR), rule(YEAR, '-', MONTH, '-', DAY), rule(YEAR, 'г', '.') ).named('DATE') parser = Parser(DATE) text = '''2015г. 18 июля 2016 2016-01-02 ''' for line in text.splitlines(): match = parser.match(line) display(match.tree.as_dot) from yargy.interpretation import fact Date = fact( 'Date', ['year', 'month', 'day'] ) DATE = or_( rule( DAY.interpretation( Date.day ), MONTH_NAME.interpretation( Date.month ), YEAR.interpretation( Date.year ) ), rule( YEAR.interpretation( Date.year ), '-', MONTH.interpretation( Date.month ), '-', DAY.interpretation( Date.day ) ), rule( YEAR.interpretation( Date.year ), 'г', '.' ) ).interpretation( Date ).named('DATE') parser = Parser(DATE) for line in text.splitlines(): match = parser.match(line) display(match.tree.as_dot) for line in text.splitlines(): match = parser.match(line) display(match.fact) MONTHS = { 'январь': 1, 'февраль': 2, 'март': 3, 'апрель': 4, 'мая': 5, 'июнь': 6, 'июль': 7, 'август': 8, 'сентябрь': 9, 'октябрь': 10, 'ноябрь': 11, 'декабрь': 12 } DATE = rule( DAY.interpretation( Date.day.custom(int) ), MONTH_NAME.interpretation( Date.month.normalized().custom(MONTHS.get) ), YEAR.interpretation( Date.year.custom(int) ) ).interpretation( Date ) parser = Parser(DATE) match = parser.match('18 июня 2016') match.fact NAME = rule( gram('Name').interpretation( Name.first.inflected() ), gram('Surn').interpretation( Name.last.inflected() ) ).interpretation( Name ) parser = Parser(NAME) for match in parser.findall('Илье Ивановым, Павлом Семенов'): print([_.value for _ in match.tokens]) parser = Parser(NAME) for match in parser.findall('Сашу Иванову, Саше Иванову'): display(match.fact) from yargy.relations import gnc_relation gnc = gnc_relation() NAME = rule( gram('Name').interpretation( Name.first.inflected() ).match(gnc), gram('Surn').interpretation( Name.last.inflected() ).match(gnc) ).interpretation( Name ) parser = Parser(NAME) for match in parser.findall('Илье Ивановым, Павлом Семенов, Саша Быков'): print([_.value for _ in match.tokens]) parser = Parser(NAME) for match in parser.findall('Сашу Иванову, Саше Иванову'): display(match.fact)