Download date_parser.py from senyukhin/annotator: direct link, hf CLI and curl.
- Browser
- Download file 14.3 kB
-
https://huggingface.co/spaces/senyukhin/annotator/resolve/main/date_parser.py
- Command line
-
hf download hf://spaces/senyukhin/annotator/date_parser.py
-
curl -L -o date_parser.py https://huggingface.co/spaces/senyukhin/annotator/resolve/main/date_parser.py
14.3 kB
| from yargy import ( | |
| Parser, | |
| rule, | |
| and_, or_ | |
| ) | |
| from yargy.interpretation import fact | |
| from yargy.predicates import ( | |
| eq, gte, lte, length_eq, | |
| dictionary, normalized, | |
| ) | |
| import pandas as pd | |
| DateRange = fact( | |
| 'DateRange', | |
| ['start_day', 'start_month', 'start_year', 'stop_day', 'stop_month', 'stop_year'] | |
| ) | |
| class DateRange(DateRange): | |
| years_collection = [1900] | |
| def normalized(self): | |
| if self.start_year != None: | |
| self.years_collection.append(self.start_year) | |
| else: | |
| self.start_year = self.years_collection[-1] | |
| if self.start_day == None: | |
| self.start_day = 0 | |
| if self.start_month == None: | |
| self.start_month = 0 | |
| if self.stop_year == None: | |
| self.stop_year = self.start_year | |
| if self.stop_month == None: | |
| self.stop_month = self.start_month | |
| if self.stop_day == None: | |
| self.stop_day = self.start_day | |
| return self | |
| def get_start_date(self): | |
| return str(self.start_year) + '-' + str(self.start_month).zfill(2) + '-' + str(self.start_day).zfill(2) | |
| def get_stop_date(self): | |
| return str(self.stop_year) + '-' + str(self.stop_month).zfill(2) + '-' + str(self.stop_day).zfill(2) | |
| MONTHS = { | |
| 'январь': 1, | |
| 'февраль': 2, | |
| 'март': 3, | |
| 'апрель': 4, | |
| 'май': 5, | |
| 'июнь': 6, | |
| 'июль': 7, | |
| 'август': 8, | |
| 'сентябрь': 9, | |
| 'октябрь': 10, | |
| 'ноябрь': 11, | |
| 'декабрь': 12, | |
| } | |
| MONTHS_LATIN = { | |
| 'I': 1, | |
| 'II': 2, | |
| 'III': 3, | |
| 'IV': 4, | |
| 'V': 5, | |
| 'VI': 6, | |
| 'VII': 7, | |
| 'VIII': 8, | |
| 'IX': 9, | |
| 'X': 10, | |
| 'XI': 11, | |
| 'XII': 12 | |
| } | |
| DAY_START = and_( | |
| gte(1), | |
| lte(31) | |
| ).interpretation( | |
| DateRange.start_day.custom(int) | |
| ) | |
| DAY_STOP = and_( | |
| gte(1), | |
| lte(31) | |
| ).interpretation( | |
| DateRange.stop_day.custom(int) | |
| ) | |
| MONTH_NAME_START = dictionary(MONTHS).interpretation( | |
| DateRange.start_month.normalized().custom(MONTHS.__getitem__) | |
| ) | |
| MONTH_NAME_STOP = dictionary(MONTHS).interpretation( | |
| DateRange.stop_month.normalized().custom(MONTHS.__getitem__) | |
| ) | |
| MONTH_LATIN_NAME_START = dictionary(MONTHS_LATIN).interpretation( | |
| DateRange.start_month.custom(MONTHS_LATIN.__getitem__) | |
| ) | |
| MONTH_LATIN_NAME_STOP = dictionary(MONTHS_LATIN).interpretation( | |
| DateRange.stop_month.custom(MONTHS_LATIN.__getitem__) | |
| ) | |
| MONTH_START = and_( | |
| gte(1), | |
| lte(12) | |
| ).interpretation( | |
| DateRange.start_month.custom(int) | |
| ) | |
| MONTH_STOP = and_( | |
| gte(1), | |
| lte(12) | |
| ).interpretation( | |
| DateRange.stop_month.custom(int) | |
| ) | |
| YEAR_START = and_( | |
| gte(1800), | |
| lte(2100) | |
| ).interpretation( | |
| DateRange.start_year.custom(int) | |
| ) | |
| YEAR_STOP = and_( | |
| gte(1800), | |
| lte(2100) | |
| ).interpretation( | |
| DateRange.stop_year.custom(int) | |
| ) | |
| YEAR_SHORT_START = and_( | |
| length_eq(2), | |
| gte(0), | |
| lte(99) | |
| ).interpretation( | |
| DateRange.start_year.custom(lambda _: 1900 + int(_)) | |
| ) | |
| YEAR_SHORT_STOP = and_( | |
| length_eq(2), | |
| gte(0), | |
| lte(99) | |
| ).interpretation( | |
| DateRange.stop_year.custom(lambda _: 1900 + int(_)) | |
| ) | |
| YEAR_WORD = or_( | |
| rule('г', eq('.').optional()), | |
| rule(normalized('год')) | |
| ) | |
| PUNCT_DIVISION_DATES = or_( | |
| rule('-'), # дефис | |
| rule('—'), # короткое тире | |
| rule('—') # длинное тире | |
| ) | |
| PUNCT = or_( | |
| rule('.'), | |
| rule('/') | |
| ) | |
| DATE_RANGE = or_( | |
| # 1-2 января 1900 | |
| rule( | |
| DAY_START, | |
| PUNCT_DIVISION_DATES, | |
| DAY_STOP, | |
| PUNCT.optional(), | |
| or_( | |
| MONTH_NAME_START, | |
| MONTH_START, | |
| MONTH_LATIN_NAME_START | |
| ), | |
| PUNCT.optional(), | |
| or_( | |
| YEAR_START, | |
| YEAR_SHORT_START | |
| ).optional(), | |
| YEAR_WORD.optional() | |
| ), | |
| # 1 января - 2 февраля 1900 | |
| rule( | |
| DAY_START, | |
| PUNCT.optional(), | |
| or_( | |
| MONTH_NAME_START, | |
| MONTH_START, | |
| MONTH_LATIN_NAME_START | |
| ), | |
| PUNCT_DIVISION_DATES, | |
| DAY_STOP, | |
| PUNCT.optional(), | |
| or_( | |
| MONTH_NAME_STOP, | |
| MONTH_STOP, | |
| MONTH_LATIN_NAME_STOP | |
| ), | |
| PUNCT.optional(), | |
| or_( | |
| YEAR_START, | |
| YEAR_SHORT_START | |
| ).optional(), | |
| YEAR_WORD.optional() | |
| ), | |
| # 1 января 1900 - 2 февраля 1901 | |
| rule( | |
| DAY_START, | |
| PUNCT.optional(), | |
| or_( | |
| MONTH_NAME_START, | |
| MONTH_START, | |
| MONTH_LATIN_NAME_START | |
| ), | |
| PUNCT.optional(), | |
| or_( | |
| YEAR_START, | |
| YEAR_SHORT_START | |
| ), | |
| PUNCT_DIVISION_DATES, | |
| DAY_STOP, | |
| PUNCT.optional(), | |
| or_( | |
| MONTH_NAME_STOP, | |
| MONTH_STOP, | |
| MONTH_LATIN_NAME_STOP | |
| ), | |
| PUNCT.optional(), | |
| or_( | |
| YEAR_STOP, | |
| YEAR_SHORT_STOP | |
| ), | |
| YEAR_WORD.optional() | |
| ), | |
| # 1/I-1900 - 2/II-1901 | |
| rule( | |
| DAY_START, | |
| PUNCT, | |
| MONTH_LATIN_NAME_START, | |
| '-', | |
| or_( | |
| YEAR_START, | |
| YEAR_SHORT_START | |
| ), | |
| PUNCT_DIVISION_DATES, | |
| DAY_STOP, | |
| PUNCT, | |
| MONTH_LATIN_NAME_STOP, | |
| '-', | |
| or_( | |
| YEAR_STOP, | |
| YEAR_SHORT_STOP | |
| ), | |
| YEAR_WORD.optional() | |
| ), | |
| # 1.1.1900 / 1/II/1900 / 1 января | |
| rule( | |
| DAY_START, | |
| PUNCT.optional(), | |
| or_( | |
| MONTH_START, | |
| MONTH_NAME_START, | |
| MONTH_LATIN_NAME_START | |
| ), | |
| PUNCT.optional(), | |
| or_( | |
| YEAR_START, | |
| YEAR_SHORT_START | |
| ).optional(), | |
| YEAR_WORD.optional() | |
| ), | |
| # 1/II-1900 | |
| rule( | |
| DAY_START, | |
| PUNCT, | |
| MONTH_LATIN_NAME_START, | |
| '-', | |
| or_( | |
| YEAR_START, | |
| YEAR_SHORT_START | |
| ), | |
| YEAR_WORD.optional() | |
| ), | |
| # 1900 год | |
| rule( | |
| YEAR_START, | |
| YEAR_WORD.optional() | |
| ), | |
| # январь 1900 года | |
| rule( | |
| MONTH_NAME_START, | |
| or_( | |
| YEAR_START, | |
| YEAR_SHORT_START | |
| ), | |
| YEAR_WORD.optional() | |
| ), | |
| ).interpretation( | |
| DateRange | |
| ) | |
| def date_extractor_for_diary(text): | |
| res = { | |
| 'date_start' : [], | |
| 'date_stop' : [], | |
| 'text' : [] | |
| } | |
| entry = '' | |
| for paragraph in text.split('\n'): | |
| parser = Parser(DATE_RANGE) | |
| for match in parser.findall(paragraph): | |
| record = match.fact.normalized | |
| if record.spans[0].start in range (0, 3): | |
| start = record.get_start_date | |
| stop = record.get_stop_date | |
| res['date_start'].append(start) | |
| res['date_stop'].append(stop) | |
| if entry != '': | |
| res['text'].append(entry) | |
| entry = '' | |
| break | |
| entry += paragraph | |
| entry += '\n' | |
| if entry != '': | |
| res['text'].append(entry) | |
| return pd.DataFrame(res) | |
| def normalize_dates(start, stop): | |
| if start == stop: | |
| return start | |
| else: | |
| return f'{start} - {stop}' | |
| ######## USAGE ########### | |
| # parser = Parser(DATE_RANGE) | |
| # text = ''' | |
| # 1943 | |
| # 24 марта. Челябинск | |
| # Сегодня кончается третья четверть. Потом каникулы до 1/IV — неделю. Говорили с Москвой. Папка может предет в апреле. Хорошо бы приехал. | |
| # Я немного болел. Теперь выздоровел. От класса отстал не намного. За каникулы догоню. Во дворе у нас несколько ребят уехало. Г.Л. обещала написать письмо. Посмотрим. | |
| # Сегодня мне сообщили что И[нна].Д[митриева]. в меня втрескалась[.] Чтоб ей лопнуть! Неужели без любви нельзя обойтись. У наших ребят какое-то странное понимание о дружбе. Если увидят что стоишь и разговариваешь с какой-нибудь девочкой. Сразу дразнить: влюбился, влюбился. А для того что-бы влюбиться по моему надо подрасти. А у нас во дворе нет таких что-бы не перелюбились. В половине этого случая не исключая и меня. | |
| # В школе то-же. Какие-то идиоты кругом. Как дикари. Ну, а я то-же не лучше. Я могу влюбиться сердцем, умом никогда. | |
| # 25 марта. «И в какой стороне я не буду по какой не пройду я тропе, друга я никогда незабуду если с ним подружился в Москве…» | |
| # Друга хорошего нельзя позыбыть не только если с ним подружишь в Москве. | |
| # «В какой точке Союза не буду, и где не встречу мой друг я тебя, я тебя никогда не забуду, если ты не забудешь меня». | |
| # «Я сейчас сижу в тюрьме и не светит | |
| # Солнце мне, Кашмари, кашмари, кашмари[»]. | |
| # Эх! Не знаю что у меня на душе, что в животе я знаю там глисты, сегодня получил анализ кала. | |
| # Чорт меня побрал! Что это на меня нашло такое настроение влюбленного. Ну, ка пошлю вон. Быть тебе только другом но… | |
| # Опять!? | |
| # Последнее время я не знаю что со мной творится, но примерно догадываюсь, [запись обрывается] | |
| # 5 апреля. Началась последняя четверть. А там испытания. Кончу 6-й кл[асс]. наверно в Челябинске. В апреле в Москву конечно не поедем. | |
| # В выходной ходил стрелять в тир. Сдал на «Юный ворошиловский стрелок» . | |
| # Книга — лучший друг мой. Но такие книги что я читаю не могут заменить друга — человека. Друг. Как это слово звучит для меня непривычно. О нем я могу лишь мечтать. Дружба. Я так нуждаюсь в тебе. | |
| # 26/VIII-38 г. Весь день приготовления. Завтра едем совсем в Гдов. Вообще весь день шаталась из угла в угол, но ничего хорошего не сделала. Кой-чего выстирала. Читала. Много брусники ела. Вечером были в бане с Валей Павловой в нашей. Идем в баню, а на реке Беляев, Ванька дядин Мишкин, потом пришел Петька. Долго с ними ругались, но они ушли и мы вымылись. К школе не пошла. Весь вечер читала. Слышу, пошли от школы. Беляев остановился над окном и кричит — Марготя! | |
| # Я нисколько не изменила своего положения, только чуть улыбнулась. Он больше ничего не сказал. Я после читала очень долго. Вообще, я сказала, что сегодня спать не буду. Немного пописала дневник, но спать все же захотелось. Легла, а Ляля сидит. Велела ей разбудить как будет ложиться. | |
| # 27/VIII-38 г. Через час как раз она пошла спать. Я встала. Опять читала. Валя начала плакать. С ней долго возилась. Начинает светлеть. Уже три. Еще в первом часу у меня были Валя Павлова с Тоней Ефремовой — она сегодня ночует у Вали и с нами вместе едет. Сговорились в четыре ехать. Разбудила маму. Быстро собрались, поехали. Павловы проспали, даже и тетя Настя. Ну поехали. До свиданье Заовражье! Сегодня все наши едут в Ленинград. За Рудном я захотела спать и легла, но спала не много, а только лежала. В Вейне остановились, по кушали немного. Конфет 300 гр. взяла. Поехали дальше. Всю дорогу хохотали. Ну Ефремова — это черт! Так и смешит. На поезд опоздали. За железной дорогой, не доезжая еще деревни Добручи, опять кормили лошадь и сами обедали. Я очень замаялась и спать хочу, но надо размаяться. За Добручи заехали, стало веселее. Дорога прямая. Только и отсчитываем верстовые столбы. | |
| # 17 сентября (четверг), 1970 год | |
| # 18 сентября (пятница), 1970 год | |
| # Юрка, Юрка, ты не сдерживаешь свое слово | |
| # 1-12.1. Рло | |
| # 1/I - 2/II лоиывал | |
| # ''' | |
| # for match in parser.findall(text): | |
| # record = match.fact.normalized | |
| # # print(record.spans) | |
| # start = record.get_start_date | |
| # stop = record.get_stop_date | |
| # if start != stop: | |
| # print(f'{start} - {stop}') | |
| # else: | |
| # print(start) |