From a46cbea30667330486999a86c6c2c3ad6536003d Mon Sep 17 00:00:00 2001 From: Sergey Sablin Date: Fri, 7 Feb 2020 22:22:57 +0300 Subject: [PATCH 1/2] Customized date parsing --- Python-bot/data/base.json | 2 +- Python-bot/server.py | 29 ++++++++++++++++++----------- parsing/config.proto | 16 ++++++++++++++++ parsing/first.cxx | 4 ++++ parsing/mydic.gzt | 15 +++++++++++++++ parsing/test.txt | 1 + setup.py | 3 ++- 7 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 parsing/config.proto create mode 100644 parsing/first.cxx create mode 100644 parsing/mydic.gzt create mode 100644 parsing/test.txt diff --git a/Python-bot/data/base.json b/Python-bot/data/base.json index d3abb84..bdd9d08 100644 --- a/Python-bot/data/base.json +++ b/Python-bot/data/base.json @@ -1 +1 @@ -{"205589546": {"2020-01-29|13:39:28.778879": "a", "2020-01-29|13:39:35.527274": "aa", "2020-01-29|13:39:40.711174": "aaa"}} \ No newline at end of file +{"205589546": {"2020-01-29|13:39:28.778879": "a", "2020-01-29|13:39:35.527274": "aa", "2020-01-29|13:39:40.711174": "aaa"}, "109297779": {"2020-02-07|21:46:53.837151": "\u041d\u0435 \u043c\u043e\u0433\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443", "2020-02-07|21:47:25.329122": "\u041d\u0435 \u043c\u043e\u0433\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443", "null": "\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0438\u043d\u043e 08.02.2020"}} \ No newline at end of file diff --git a/Python-bot/server.py b/Python-bot/server.py index ef2d086..9828d0d 100644 --- a/Python-bot/server.py +++ b/Python-bot/server.py @@ -1,9 +1,10 @@ import requests import json -import random import datetime +import re from user import UserList + class Server: group_id = 191177272 access_token = 'access_token=f068c796542cba0f4dbdd0f6e39ba656a489731d36cfdcbdf7cee30de822ae000aa9e1aa8293bc61d77c7' @@ -12,16 +13,18 @@ class Server: data = UserList() def __init__(self): - Server.getLongPollServer(self) + self.server = str() + self.key = str() + self.ts = str() + self.get_long_poll_server() - def getLongPollServer(self): + def get_long_poll_server(self): method = 'groups.getLongPollServer?group_id=191177272' reply = requests.get("&".join([Server.body + method, Server.v, Server.access_token])) data = json.loads(reply.text) self.server = data['response']['server'] self.key = data['response']['key'] self.ts = data['response']['ts'] - # print(self.server, self.key, self.ts) def simple_request(self): method = self.server + '?act=a_check&key=' + self.key + '&ts=' + self.ts + "&wait=25" @@ -30,16 +33,20 @@ def simple_request(self): def simple_loop(self): reply = json.loads(self.simple_request().text) self.ts = reply['ts'] - # print(json.dumps(reply, indent='\t')) if reply['updates']: message = reply['updates'][0]['object']['message']['text'] + if 'Напомни' in message: + date = re.search('$d{2}-$d{2}-$d{4}', message) + if str(date) != '': + message = str(message).replace('Напомни ', '').replace(str(date), '') + else: + message = 'Не могу разобрать команду' + date = datetime.datetime.now().isoformat('|') + else: + message = 'Не могу разобрать команду' + date = datetime.datetime.now().isoformat('|') user_id = reply['updates'][0]['object']['message']['from_id'] - self.data.add_rec(str(user_id), {datetime.datetime.now().isoformat('|'): message}) - random_id = random.randint(0, 100) - method = 'messages.send?' + 'user_id=' + str(user_id) + '&random_id=' + str(random_id) \ - + '&message=' + message - r = requests.get("&".join([Server.body + method, Server.v, Server.access_token])) - print("&".join([Server.body + method, Server.v, Server.access_token])) + self.data.add_rec(str(user_id), {date: message}) self.simple_loop() diff --git a/parsing/config.proto b/parsing/config.proto new file mode 100644 index 0000000..9bad2d6 --- /dev/null +++ b/parsing/config.proto @@ -0,0 +1,16 @@ +encoding "utf8"; // указываем кодировку, в которой написан конфигурационный файл + +TTextMinerConfig { + Dictionary = "mydic.gzt"; // путь к корневому словарю + + PrettyOutput = "PrettyOutput.html"; // путь к файлу с отладочным выводом в удобном для чтения виде + + Input = { + File = "test.txt"; // путь к входному файлу + } + + Articles = [ + { Name = "наша_первая_грамматика" } // название статьи в корневом словаре, + // которая содержит запускаемую грамматику + ] +} diff --git a/parsing/first.cxx b/parsing/first.cxx new file mode 100644 index 0000000..a7104b1 --- /dev/null +++ b/parsing/first.cxx @@ -0,0 +1,4 @@ +#encoding "utf-8" // сообщаем парсеру о том, в какой кодировке написана грамматика +#GRAMMAR_ROOT S // указываем корневой нетерминал грамматики + +Remind -> Noun diff --git a/parsing/mydic.gzt b/parsing/mydic.gzt new file mode 100644 index 0000000..db3cc81 --- /dev/null +++ b/parsing/mydic.gzt @@ -0,0 +1,15 @@ +encoding "utf8"; // указываем кодировку, в которой написан этот файл + +import "base.proto"; // подключаем описания protobuf-типов (TAuxDicArticle и прочих) +import "articles_base.proto"; // Файлы base.proto и articles_base.proto встроены в компилятор. + // Их необходимо включать в начало любого gzt-словаря. + +TAuxDicArticle "Базовая грамматика" +{ + key = { "tomita:first.cxx" type=CUSTOM } +} + +TAuxDicArticle "Напоминания" +{ + key = { "Напомни" | "напомни"} +} diff --git a/parsing/test.txt b/parsing/test.txt new file mode 100644 index 0000000..dce37b9 --- /dev/null +++ b/parsing/test.txt @@ -0,0 +1 @@ +Тяжёлый труд облагораживает хорошего человека. diff --git a/setup.py b/setup.py index f5c36aa..fd7d0c8 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,8 @@ requirements = [ # TODO: put package requirements here - 'requests' + 'requests', + 'datetime' ] test_requirements = [ From 32427beb88a21c5927d65adc7570ee4db4897185 Mon Sep 17 00:00:00 2001 From: Sergey Sablin Date: Fri, 7 Feb 2020 23:10:07 +0300 Subject: [PATCH 2/2] Customized parsing with Yandex Tomita parser --- Python-bot/data/base.json | 2 +- Python-bot/parsing/PrettyOutput.html | 51 +++++++++++++++++++++++++++ Python-bot/parsing/config.proto | 16 +++++++++ Python-bot/parsing/first.bin | Bin 0 -> 1295 bytes Python-bot/parsing/first.cxx | 4 +++ Python-bot/parsing/mydic.gzt | 16 +++++++++ Python-bot/parsing/mydic.gzt.bin | Bin 0 -> 11304 bytes Python-bot/parsing/test.txt | 4 +++ Python-bot/server.py | 7 ++++ 9 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 Python-bot/parsing/PrettyOutput.html create mode 100644 Python-bot/parsing/config.proto create mode 100644 Python-bot/parsing/first.bin create mode 100644 Python-bot/parsing/first.cxx create mode 100644 Python-bot/parsing/mydic.gzt create mode 100644 Python-bot/parsing/mydic.gzt.bin create mode 100644 Python-bot/parsing/test.txt diff --git a/Python-bot/data/base.json b/Python-bot/data/base.json index bdd9d08..81dbe8d 100644 --- a/Python-bot/data/base.json +++ b/Python-bot/data/base.json @@ -1 +1 @@ -{"205589546": {"2020-01-29|13:39:28.778879": "a", "2020-01-29|13:39:35.527274": "aa", "2020-01-29|13:39:40.711174": "aaa"}, "109297779": {"2020-02-07|21:46:53.837151": "\u041d\u0435 \u043c\u043e\u0433\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443", "2020-02-07|21:47:25.329122": "\u041d\u0435 \u043c\u043e\u0433\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443", "null": "\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0438\u043d\u043e 08.02.2020"}} \ No newline at end of file +{"205589546": {"2020-01-29|13:39:28.778879": "a", "2020-01-29|13:39:35.527274": "aa", "2020-01-29|13:39:40.711174": "aaa"}, "109297779": {"2020-02-07|21:46:53.837151": "\u041d\u0435 \u043c\u043e\u0433\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443", "2020-02-07|21:47:25.329122": "\u041d\u0435 \u043c\u043e\u0433\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443", "null": "\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0438\u043d\u043e 08.02.2020", "null": "\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0438\u043d\u043e 08.02.2020"}} \ No newline at end of file diff --git a/Python-bot/parsing/PrettyOutput.html b/Python-bot/parsing/PrettyOutput.html new file mode 100644 index 0000000..5e28eb8 --- /dev/null +++ b/Python-bot/parsing/PrettyOutput.html @@ -0,0 +1,51 @@ + +

Напомни +   + завтра +   + сходить +   + в +   + качалочку +   + напомни +   + погулять +   + напомни +   + напомни +   + иии +   + EOS 

+ + + + + + + + + + + + + + + + + + + + + +
TextType
напомниTAuxDicArticle [Базовая грамматика]
напомниTAuxDicArticle [Базовая грамматика]
напомниTAuxDicArticle [Базовая грамматика]
напомниTAuxDicArticle [Базовая грамматика]
+ diff --git a/Python-bot/parsing/config.proto b/Python-bot/parsing/config.proto new file mode 100644 index 0000000..1200fed --- /dev/null +++ b/Python-bot/parsing/config.proto @@ -0,0 +1,16 @@ +encoding "utf8"; // указываем кодировку, в которой написан конфигурационный файл + +TTextMinerConfig { + Dictionary = "mydic.gzt"; // путь к корневому словарю + + PrettyOutput = "PrettyOutput.html"; // путь к файлу с отладочным выводом в удобном для чтения виде + + Input = { + File = "test.txt"; // путь к входному файлу + } + + Articles = [ + { Name = "Базовая грамматика" } // название статьи в корневом словаре, + // которая содержит запускаемую грамматику + ] +} diff --git a/Python-bot/parsing/first.bin b/Python-bot/parsing/first.bin new file mode 100644 index 0000000000000000000000000000000000000000..0ead54ff9402457caf755d21233c9443255b4f88 GIT binary patch literal 1295 zcmXX`O>7%Q6#iy+9ZZ{K9lMl5Th{q8X`0ByB+U=1@;rT&Y-`Gf!Qq1)B74_i(Ju}c(5(9;S z;eOs*%9I9&hDv>X7c#Re>Hg3W*S}O)TR#|%o^B^Nmpq+QPmoISTDlWxcm+~Bjxeu3kAWDQ{!SD=0lHZx^c ztxjm?=INA9Okd_^^)c9eXwUZm=92K%4E;Q`)Op~|oCqq;J!q%9$k<`q^KL-F{pU0S zmJ`0u%Wcrkv;jCSl}L)B()bfjHnbQpL0C7lH-A1S*)7ksRVW=xN8L5G`4t_xl|hp zar_y4GwpH95*C$5RT1~w(9)bh!4!sG5pl2-{8=hYm6sEU#Zn0J&NX2hTko^ju@l%? z65P`(Gh$O|#@M1LMWb-Xy}-~-agV*6pWX`o#AkjwzigPr3GV$vC)`CO3HBOp%?iun zm+X@BG4%23#-yRogT>{V6-}HVcS+A}`Due$do~cg70^Pplcs3}@NyT$bxWe$y4{{4rnv(FD2; zCxzWf9tfH0Rx+GT{7U2MxO zXK*`6W6XAJVKU@E$LZv>?_4cad3kyxX8{e1YW5@;W;_NtHqE zZf&>rW9^69_qDy+KF#-Qdk?ptpq-1ta)Zs0X*5uXaj1L9;~H8zB4F=Ay$wa3VVAMQ z&?Rkm%!&0y#|iFGR%HDt#@v?NQ53jSPoP^4S5JgqsG z`4M6XjXh8+U`kJYm0auA$`BUA$KcAeoJ_t&O#fPnbv~fK9jA{Nlu@k0I3C|Xzq zaud+RCVwd$cHakHg^~#?g`V*2Xd@aW#QwU3h=kPP=yAvu;0;9Sa>t-lkd&2Yftvs! zDb+^;@X`Mh;zpQivYr~jp{PT^nYy|X_LM*+A~)+GPu0gkrZnQ}f6p65qy{x2LgIS( J-Vv(s`xkJeBZmM0 literal 0 HcmV?d00001 diff --git a/Python-bot/parsing/first.cxx b/Python-bot/parsing/first.cxx new file mode 100644 index 0000000..28b5637 --- /dev/null +++ b/Python-bot/parsing/first.cxx @@ -0,0 +1,4 @@ +#encoding "utf-8" // сообщаем парсеру о том, в какой кодировке написана грамматика +#GRAMMAR_ROOT Remind // указываем корневой нетерминал грамматики + +Remind -> Word; diff --git a/Python-bot/parsing/mydic.gzt b/Python-bot/parsing/mydic.gzt new file mode 100644 index 0000000..7a2471b --- /dev/null +++ b/Python-bot/parsing/mydic.gzt @@ -0,0 +1,16 @@ +encoding "utf8"; // указываем кодировку, в которой написан этот файл + +import "base.proto"; // подключаем описания protobuf-типов (TAuxDicArticle и прочих) +import "articles_base.proto"; // Файлы base.proto и articles_base.proto встроены в компилятор. + // Их необходимо включать в начало любого gzt-словаря. + +TAuxDicArticle "Напоминания" +{ + key = { "Напомни" | "напомни"} +} + +TAuxDicArticle "Базовая грамматика" +{ + key = { "tomita:first.cxx" type=CUSTOM } +} + diff --git a/Python-bot/parsing/mydic.gzt.bin b/Python-bot/parsing/mydic.gzt.bin new file mode 100644 index 0000000000000000000000000000000000000000..e0c8601d3209254a2dfe0eaf80e69c7c11cae882 GIT binary patch literal 11304 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 ba(l-w0e<>>jR-pJ`3Ctw+mp>{TP^+