Cat0125 commited on
Commit
51ce03f
1 Parent(s): afbac08

Initial commit

Browse files
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ __pycache__
2
+ .vscode
README.md CHANGED
@@ -1,13 +1,13 @@
1
  ---
2
- title: Text Generator V2
3
- emoji:
4
  colorFrom: pink
5
  colorTo: purple
6
  sdk: gradio
7
- sdk_version: 3.28.0
8
- app_file: app.py
9
- pinned: false
10
  license: openrail
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: Text Generator v2
3
+ emoji: 💻
4
  colorFrom: pink
5
  colorTo: purple
6
  sdk: gradio
7
+ sdk_version: 3.27.0
8
+ app_file: main.py
9
+ pinned: true
10
  license: openrail
11
  ---
12
 
13
+ This tool allpws you to generate texts based on given context.
classes.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from random import choice
2
+ import re
3
+
4
+ import pymorphy3
5
+
6
+
7
+ RE_ENGLISH = re.compile(r'[a-zA-Z]')
8
+ morph = pymorphy3.MorphAnalyzer()
9
+
10
+ # The Token class represents a word and its next word in a text, along with the count of occurrences
11
+ # and its contexts.
12
+ class Token:
13
+ def __init__(self, word, next_word, text, sentence = None, turbo = False):
14
+ self.word = word
15
+ self.next_word = next_word
16
+ self.count = text.count(word + " " + next_word)
17
+ self.score = 0
18
+ self.contexts = []
19
+ for w in (sentence or text).strip().split():
20
+ if turbo or RE_ENGLISH.match(w):
21
+ self.contexts.append(w)
22
+ continue
23
+ result = morph.parse(w)
24
+ if len(result) == 0:
25
+ continue
26
+ result = result[0]
27
+ if result.tag.POS == 'NOUN':
28
+ self.contexts.append(w)
29
+ self.contexts.append(result.normal_form)
30
+
31
+ def __repr__(self):
32
+ return f"{self.word} > {self.next_word} ({self.count} matches, {len(self.contexts)} contexts)"
datamanager.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import pickle
3
+ from multiprocessing import Process
4
+
5
+ from files import read_lines
6
+
7
+ models = json.load(open("models/models.json"))
8
+
9
+ def get_texts(model_name):
10
+ return read_lines(models[model_name]["text"])
11
+
12
+ def set_data(model_name, data):
13
+ pickle.dump(data, open(models[model_name]["filename"], 'wb+'))
14
+
15
+ def get_data(model_name):
16
+ if models[model_name]["db"]:
17
+ return models[model_name]["db"]
18
+ db = pickle.load(open(models[model_name]["filename"], 'rb'))
19
+ models[model_name]["db"] = db
20
+ return db
21
+
22
+ def set_data_v2(model_name, data):
23
+ pickle.dump(data, open(models[model_name]["filename2"], 'wb+'))
24
+
25
+ def get_data_v2(model_name):
26
+ if models[model_name]["db2"]:
27
+ return models[model_name]["db2"]
28
+ db = pickle.load(open(models[model_name]["filename2"], 'rb'))
29
+ models[model_name]["db2"] = db
30
+ return db
files.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ def read_file(filename):
2
+ with open(filename, encoding="utf8") as f:
3
+ return f.read()
4
+
5
+ def read_lines(filename):
6
+ with open(filename, encoding="utf8") as f:
7
+ return f.readlines()
main.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from random import choice, choices
2
+
3
+ import gradio as gr
4
+
5
+ from datamanager import get_data, models, get_data_v2
6
+
7
+
8
+ def get_next_word_results(db2, message: str, prevword: str, high_sensetivity: bool = False):
9
+ results = []
10
+ for word in message.strip().split():
11
+ if word not in db2:
12
+ continue
13
+ for token in db2[word.strip()]:
14
+ token.score = 0
15
+ for context in token.contexts:
16
+ if (context in message) and (not high_sensetivity or token.next_word == prevword):
17
+ token.score += 1
18
+ return results
19
+
20
+ def get_next_word(db, db2, message:str, prevword:str, bot_message:str, high_sensetivity:bool = False, random_threshold:int = 0):
21
+ results = get_next_word_results(db2, message, prevword, high_sensetivity)
22
+ if len(results) <= random_threshold:
23
+ if high_sensetivity:
24
+ return choice(db).next_word
25
+ else:
26
+ return get_next_word(db, db2, message, prevword, bot_message, True)
27
+ results = list(filter(lambda x: x.score, results))
28
+ total_results = []
29
+ weights = []
30
+ for result in results:
31
+ total_results.append(result.next_word)
32
+ weights.append(result.score)
33
+ if len(total_results) == 0:
34
+ return get_next_word(db, db2, message, prevword, bot_message, True)
35
+ if len(total_results) > 5:
36
+ total_results = total_results[:5]
37
+ weights = weights[:5]
38
+ return (choices(total_results, weights=weights, k=1) or '.')[0]
39
+
40
+
41
+ def generator(user_message:str, words_count:int, random_threshold:int, model_name:str, mode:str):
42
+ db = get_data(model_name)
43
+ db2 = get_data_v2(model_name)
44
+ message = user_message.lower()
45
+ if len(message) == 0:
46
+ raise gr.Error("Message can't be empty")
47
+ text = ""
48
+ curword = ""
49
+ prevword = ""
50
+ if mode == "Continue":
51
+ text = message
52
+ curword = text.split()[-1]
53
+ text += " "
54
+ i = 0
55
+ while len(text.split()) < words_count:
56
+ prevword = curword
57
+ curword = get_next_word(db, db2, message, prevword, text, random_threshold=random_threshold)
58
+ text += curword + " "
59
+ if '.' in text:
60
+ yield text
61
+ break
62
+ if i == 0 and text.strip() == '.':
63
+ raise gr.Error("Error in generating. Try to use another prompt")
64
+ i += 1
65
+ yield text.strip()
66
+
67
+ demo = gr.Blocks(
68
+ title="Text Generator v2",
69
+ theme=gr.themes.Soft()
70
+ )
71
+ with demo:
72
+ gr.HTML("<center><h1>Text Generator v2</h1><p>Generates text using per-word context system</p></center>")
73
+ with gr.Row():
74
+ with gr.Column():
75
+ inp = gr.Textbox(label="Context message")
76
+ wordcount = gr.Slider(1, 120, value=10, step=1, label="Word count")
77
+ mode = gr.Dropdown(["Default", "Continue"], value="Default", label="Mode")
78
+ with gr.Accordion("Advanced Settings", open=False):
79
+ model = gr.Dropdown(list(models.keys()), label="Model", value="default")
80
+ random_threshold = gr.Slider(0, 10, value=0, step=1,
81
+ label="Random word threshold",
82
+ info="0 - Faster generation, more meaningful text. 10 - more randomness, less meaning, slower generation"
83
+ )
84
+ with gr.Row():
85
+ clear = gr.Button("Clear")
86
+ stop_btn = gr.Button("Stop", variant="stop")
87
+ btn = gr.Button("Submit", variant="primary")
88
+ with gr.Column():
89
+ out = gr.Textbox(label="Output")
90
+ submit_event = btn.click(fn=generator, inputs = [inp, wordcount, random_threshold, model, mode], outputs=out)
91
+ stop_btn.click(fn=None, inputs=None, outputs=None, cancels=[submit_event], queue=False)
92
+ clear.click(lambda: None, None, [inp], queue=False)
93
+ demo.queue(concurrency_count=3)
94
+ demo.launch()
models/default/data.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c96e3723c704d2d0cf07ca6e0f8010eaf706d5c085714e7ca7f3b9a94e0b98a9
3
+ size 3104581
models/default/data2.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:578b8010c2fb81c438e127063231d6a982a098875d8ca8d4b3d659093d74ad63
3
+ size 4629713
models/default/text.txt ADDED
The diff for this file is too large to render. See raw diff
 
models/models.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "default": {
3
+ "name": "default",
4
+ "filename": "models/default/data.pkl",
5
+ "filename2": "models/default/data2.pkl",
6
+ "text": "models/default/text.txt",
7
+ "db_log": "models/default/db.log",
8
+ "db": [],
9
+ "db2": []
10
+ },
11
+ "ru-lite": {
12
+ "name": "russian-lite",
13
+ "filename": "models/ru-lite/data.pkl",
14
+ "filename2": "models/ru-lite/data2.pkl",
15
+ "text": "models/ru-lite/text.txt",
16
+ "db_log": "models/ru-lite/db.log",
17
+ "db": [],
18
+ "db2": []
19
+ },
20
+ "ru-lg": {
21
+ "name": "russian-lg",
22
+ "filename": "models/ru-lg/data.pkl",
23
+ "filename2": "models/ru-lg/data2.pkl",
24
+ "text": "models/ru-lg/text.txt",
25
+ "db_log": "models/ru-lg/db.log",
26
+ "db": [],
27
+ "db2": []
28
+ }
29
+ }
models/ru-lg/data.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d6748dd219177dd4b554f2291b536293cdf095f3f460645b918035eadc111311
3
+ size 3115048
models/ru-lg/data2.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a192f4985d840d53cbf3de8916dc18a2d5b0121b1618b240fd614c69702b9f81
3
+ size 3775130
models/ru-lg/text.txt ADDED
The diff for this file is too large to render. See raw diff
 
models/ru-lite/data.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3fcbbf7ac03122930b076906aab5ab5abf0bce2a7d5979b609bcf1fefb07a5af
3
+ size 497873
models/ru-lite/data2.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:12c75d9d227ee75604cc15ae47232de749f62b7dac574ece27b84b313fab7622
3
+ size 598907
models/ru-lite/text.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ Современные историки медицины полагают, что первые методы анестезии возникли еще на заре развития человечества. Разумеется, тогда было принято действовать просто и грубо: например, вплоть до 18 века общий наркоз пациент получал в виде сильного удара дубинкой по голове; после того, как он терял сознание, врач мог приступать к операции. В качестве местной анестезии с давних времен использовались наркотические препараты. В одной из древнейших медицинских рукописей в качестве обезболивающего средства рекомендуется давать пациентам лекарства на основе опиума. В Китае и Индии опиум долгое время был неизвестен, однако там довольно рано открыли чудесные свойства марихуаны. Во 2 веке знаменитый китайский врач Хуа То во время операций давал пациентам в качестве анестезии изобретенную им смесь вина и растертой в порошок конопли. Тем временем на территории еще не открытой Колумбом Америки местные индейцы активно использовали в качестве анестезии кокаин из листьев растения кока. Достоверно известно, что инки в высокогорных Андах использовали коку для местной анестезии: местный знахарь жевал листья, а потом капал насыщенной соком слюной на рану пациента, чтобы облегчить его боль. Когда люди научились производить крепкий алкоголь, анестезия стала более доступна. Многие армии стали брать с собой в поход запасы спиртного, чтобы давать его в качестве обезболивающего раненым солдатам. Не секрет, что этот метод анестезии до сих пор используется в критических ситуациях, когда нет возможности использовать современные препараты. В редких случаях врачи пытались использовать в качестве анестезии силу внушения, например, погружали пациентов в гипнотический сон. Современным последователем этой практики стал скандально известный психотерапевт Анатолий Кашпировский.
2
+ 30 сентября 1846 года он провёл операцию по удалению зуба у пациента, используя эфир в качестве наркоза. Однако в историю вошла его более поздняя операция, 16 октября 1846 года в той же самой бостонской больнице, где был осмеян его учитель, Уильям Мортон публично удалил опухоль на шее пациента, в тот момент, когда тот находился под действием паров эфира. Операция прошла успешно, больной не почувствовал боли. Уильям Мортон не был альтруистом, он хотел не только славы, но и денег. По этой причине он во время операции не признался, что использовал для анестезии обыкновенный медицинский эфир, а стал утверждать, что это изобретённый им газ "летеон" (от слова "Лета", река забвения). Мортон получил на своё изобретение патент, но это ему не помогло. Довольно быстро выяснилось, что главный компонент "летеона" - это эфир, а он под патент не попадал. По обе стороны океана врачи начали использовать медицинский эфир для анестезии, Мортон пытался отстаивать свои права в суде, но денег так и не получил. Зато ему досталась сл��ва, именно его обычно называют создателем анестезии. Опыт применения наркоза в России также начинается с эфира. 7 февраля 1847 года его применяет Ф.И.Иноземцев. В клинике факультетской хирургии Московского университета он проводит операцию по поводу рака молочной железы. Неделей позже - 14 февраля 1847 года свою первую операцию под эфирным наркозом во 2-м Военно-сухопутном госпитале Санкт-Петербурга осуществляет другой великий русский хирург - Н.И.Пирогов.
3
+ Зато сенсацией стала серия научных статей про кокаин, написанных молодым психиатром Зигмундом Фрейдом. Фрейд впервые попробовал кокаин в 1884 году и был поражен его действием: употребление этого вещества излечило его от депрессии, придало уверенности в себе. В том же году молодой ученый пишет статью "О коке", где настойчиво рекомендует использовать кокаин как местное обезболивающее средство, а также как лекарство от астмы, расстройства пищеварения, депрессии, неврозов. Исследования Фрейда в этой области активно поддерживались фармацевтическими фирмами, которые предвкушали огромные прибыли. Будущий отец психоанализа опубликовал аж 8 статей о свойствах кокаина, однако в последних работах на эту тему он уже менее восторженно писал об этом веществе. В этом нет ничего удивительного, ведь от злоупотребления кокаином умер близкий друг Фрейда Эрнст фон Фляйшль. Хотя об анестезирующем действии кокаина уже было известно по работам Анрепа и Фрейда, славу первооткрывателя местной анестезии получил офтальмолог Карл Коллер. Этот молодой врач, как и Зигмунд Фрейд, работал в Венской Общей больнице и жил с ним на одном этаже. Когда Фрейд рассказал ему о своих экспериментах с кокаином, Коллер решил проверить, может ли это вещество использоваться в качестве местной анестезии при операции на глазах. Опыты показали его эффективность, и в 1884 году Коллер доложил о результатах исследований на заседании Общества врачей Вены. Кокаин использовали не только врачи, но и все желающие, он свободно продавался во всех аптеках и пользовался почти такой же популярностью, как аспирин в наши дни. В 20 веке в анестезиологии кокаин заменили более безопасные препараты: прокаин, новокаин, лидокаин. Так анестезиология наконец-то стала не только эффективной, но и безопасной.
4
+ Считается, что роскошные волосы - один из главных инструментов женской привлекательности. Но на самом деле мужчинам в этом плане повезло намного больше: даже при абсолютном отсутствии шевелюры они могут выглядеть стильно, брутально и сексуально. Но если волосы все еще не покинули мудрые головы наших спутников жизни, необходимо разобраться, как не испортить подаренное природой сокровище неумелым уходом и неудачной стрижкой. Главное правило: для каждого типа волос - свои решения. Большинство мужчин европейского типа имеют именно такие волосы: русые, создающие легкую "волну" и довольно густые. Сам по себе такой тип волос - настоящий подарок, ведь их обладатель может выбрать огромное количество стилей, стоит лишь приложить немного усилий. Самая грубая ошибка при стрижке таких волос - убирать слишком много по бокам и при этом оставлять длинные волосы сверху. Если бы волосы были совершенно прямые, подобная прическа еще могла бы выглядеть аккуратно, пусть и очень консервативно. Но стоит волосам отрасти на несколько миллиметров, стрижка теряет форму. Не стоит пренебрегать средствами для укладки: небольшое количество пены позволит придать волосам ухоженный вид и не позволит им взъерошиваться. Не менее досадная ошибка - использование машинки для стрижки волос по бокам и сзади. Ножницы и только ножницы - только благодаря этому инструменту в умелых руках парикмахера стрижка получится однородной и ровной. Во-первых, классика: чуть большая длина сверху и соответственно меньшая - по бокам и сзади. Кстати, такой вариант чаще всего мальчики выбирают еще в школе и не меняют стрижку практически до старости. Во-вторых, более современная и стильная стрижка, при которой длина волос остается везде одинаковой. Усмирить непокорные пряди можно с помощью мусса, причем создать эффект актуального "творческого беспорядка" на голове - проще простого. Прямые и тонкие: хрупкая мечта. Иметь такой тип волос хотят большинство мужчин, но обладают немногие. Такие волосы характерны для представителей восточной Азии и Испании. Уже сам по себе такой тип волос - мягкий и неизменно блестящий - выглядит здорово, но многим мужчинам удается испортить и его плохой стрижкой. Далеко не всем молодым людям по душе тот факт, что их волосы ведут себя слишком свободно. Проблему свисающих волос они в буквальном смысле пресекают на корню, то есть делают слишком короткую стрижку. Хотя намного правильнее, наоборот, отрастить волосы (в разумных пределах) и с помощью кондиционеров и муссов придавать им ухоженный, блестящий вид и легкий объем. Но если все-таки вы хотите волосы покороче, избегайте следующей распространенной ошибки - стрижки "под горшок". Поверьте, подобный вариант смотрится мило лишь на школьниках. Впрочем, и другая крайность неприемлема: если вы не средневековый король, не рок-звезда или байкер, не стоит отращивать слишком длинные волосы. Кудрявые волосы чаще всего смотрятся не просто хорошо, но даже роскошно. Поскольку в большинстве случаев они еще и густые. Такой шевелюрой могут похвастаться греки, испанцы, итальянцы, евреи. Впрочем, пояснения все-таки необходимы, поскольку даже эти счастливчики умудряются испортить этот дар природы. Чтобы кудри выглядели более естественно и свободно, их обладатели иногда злоупотребляют гелями, восками и кремами, которые утяжеляют волосы. А это не только вредно, но и неприятно визуально: создается ощущение, что волосы мылись уже очень давно. Но и пренебрегать средствами для укладки не стоит. Хорошо, если вы студент или артист. Но даже самые шикарные кудри, торчащие во все стороны, не совместимы с деловым стилем. Классический вариант: постричь волосы довольно коротко и зачесывать назад с помощью небольшого количества мусса. Либо сделать пробор с легким акцентом на любую сторону. Кстати, многие кудрявые мужчины вообще предпочитают не "заморачиваться" и делают максимально короткую стрижку, не требующую никакой укладки. Что тоже выглядит очень эффектно. Чаще всего облысение начинается с того, что волосы на линии лба или на макушке становятся более тонкими, а затем и вовсе начинают выпадать. Очень быстро появляются либо залысины, либо лысый участок на затылке, при этом волосы сбоку и сзади не выпадают довольно-таки долго. Самая грубая ошибка - пытаться замаскировать лысину, зачесывая волосы назад или набок. На самом деле это лишь подчеркивает проблему. Отращивать имеющиеся волосы слишком длинными - также неверный путь, акцентирующий внимание на лысине. Молодые люди идут еще дальше: используют гель. Гель, который склеивает волосы и еще больше обнажает лысину. При начальной стадии облысения используйте муссы и кондиционеры для того, чтобы придать волосам более естественный вид. Отращивайте волосы лишь на несколько сантиметров и зачесывайте их так, чтобы не акцентировать внимание на линии роста волос. Но если лысина становится все более крупной, вы можете выбрать радикальный - и, как правило, оптимальный - вариант: побриться наголо. Во-первых, это очень удобно, а во-вторых, сексуально. Разумеется, перечисленные типы волос и вариантов стиля - далеко не истина в последней инстанции. Главное - обязательно уделяйте вашим волосам внимание. Для того чтобы определиться с образом, не бойтесь задавать вопросы: стилисту, парикмахеру или даже собственной спутнице жизни (последние, кстати, знают об уходе за волосами гораздо больше, чем вам кажется).
5
+ Ни одно животное не способно испытывать скуку, когда его жизненные потребности удовлетворены. Животные вполне комфортно чувствуют себя в состоянии покоя. Нормальная скука - это естественная реакция на определенную ситуацию. Встречается также неситуативная и продолжительная скука: она может оказаться симптомом депрессии. Потому что начало депрессии, как правило, знаменуется не подавленным настроением, а как раз утратой интересов ко всему, что еще не так давно представлялось значимым. И, наконец, патологическая скука - это состояние, в котором человек скучает в течение всей своей жизни. Скука, например, у древних греков так и не выявлена. В эпоху Возрождения появилась меланхолия, которую связывали скорее с телесными недугами, чем с душевными. Позднее появились синонимичные хандра и сплин - уже томительная скука. С тех пор скука не проходила. Согласно представлению, что скука - это "неубиваемое" время, скука - неизбежный итог растерянности, которую испытывает человек, удовлетворивший свои базовые потребности и высвободивший немного свободного времени. Причем, эта закономерность работает как на частном уровне (например, скука пенсионера или безработного), так и на общесоциальном: неслучайно в индустриальную эпоху люди, работающие всего 8-9 часов в сутки, скучают гораздо отчаяннее, чем крестьяне, вынужденные работать постоянно, лишь с перерывами на сон. Психологи считают, что одна из возрастных задач, которую должен решить ребенок в 8-10 лет, - умение самостоятельно находить себе занятия и развлечения. Наверное, это идеалистическое представление: как показывает практика, многие люди не решают эту проблему и к 80 годам. Скука (а вместе с ней подавленность и апатия) часто возникает, если способности человека гораздо выше, чем требует его окружение и конкретные ситуации. В результате - отсутствие поглощенности и захваченности процессом. Скука - как недостаток мотивации. Об этом так любят говорить все, кто имеет отношение к работе с персоналом. Согласно их представлениям, все очень просто: если человек мотивирован и видит перед собой цель, он просто не может заскучать. Все это здорово, но ситуации, в которых цели видны, а смысл не обнаружен, достаточно часты в нашей жизни (офисные работники знают). Поэтому скука как отсутствие мотивации является всего лишь проявлением большего: скуки как отсутствия смысла. Скуку, все нарастающую в европейском обществе можно связать не только с высвобождением большего количества свободного времени, но и с отрывом от традиционного мировосприятия. Иначе говоря, пока человек жил традицией, вопрос поиска целей и смыслов перед ним даже не стоял: живи так, как жили твои предки, и да продлятся твои годы на земле. С исчезновением традиционного общества оказалось, что для каждого цели - индивидуальны, среди их множества надо непременно найти свою. А жить без цели - вроде бы как и не жить вовсе. Лучше уж плохонькая, чужая, неподходящая, зато цель. Скука может быть осознанной и неосознанной. Ведь правда же можно жить в ежедневной рутине, просто не осознавая, что тебе скучно до скрежета зубовного? И так случается довольно часто, тем более что наготове куча оправданий: все так живут, ничего не поделать, надо же как-то существовать, все будет хорошо. Для того, чтобы осознать свою скуку, нужна немалая смелость - наверное, это имел в виду Бродский, когда писал: "Скука - обнажение корней бытия: чистых, ничем не прикрытых. Требуется мужество, чтобы это выдержать, не убегать от этого. Когда вас одолевает скука, предайтесь ей. Скука - это ваше окно на бесконечность времени, то есть на вашу незначительность в нем. Это, конечно, не прозвучит музыкой для вашего слуха; однако ощущение тщетности, ограниченной значимост�� ваших даже самых высоких, самых пылких действий лучше, чем иллюзия их плодотворности и сопутствующее этому самомнение". Можно лечить болезнь, борясь с симптомами, а не с причиной. Точно так же можно попытаться компенсировать скуку, вместо нудных разбирательств в том, чем же она вызвана. К счастью, общество предлагает некоторый набор средств легальной компенсации: СМИ (следим за ужасами и катастрофами, и жизнь покажется ярче), алкоголь (освобождаем расхристанное подсознание), туризм (внимательно смотрим на оригинальненькое). Для общества важно одно: чтобы компенсация не стала деструктивной - а уж то, что она дает временное облегчение, дело десятое.
6
+ Родинки есть у каждого человека. И уже давно люди заметили, что их расположение на теле несет в себе некую информацию о характере и судьбе их обладателя. Чтобы истолковать эти знаки, нужно обратить внимание на их внешний вид и место расположения на теле. Размер родинки определяет степень влияния, оказываемого на жизнь человека. Родинки округлой формы считаются благоприятным знаком, тогда как неправильная, угловатая форма - знаком негативным. Также чем темнее цвет родинки, тем менее благоприятно значение.Если на родинке есть волоски - это плохое знамение, указывающее на возможную неудачу в финансовых делах, причем это напрямую связано с длиной волосков, то есть чем они короче - тем меньше отрицательное влияние. Ниже приведены значения родинок в зависимости от их места расположения на теле, начиная с головы. На правой стороне лба указывает на незаурядный интеллект, а также на то, что человеку в жизни, скорее всего, придется много путешествовать. На брови - это знак долгого и счастливого брака (особенно если "отметка судьбы" расположена справа). У внешнего края глаза - указывает на спокойный, скромный характер. На ухе говорит о безрассудстве. На носу - очень счастливый знак, указывающий на везучего в жизни человека. Если родинка сбоку - это говорит о страстной натуре. На щеке - знак счастливого брака, чем ближе она к губам, тем благоприятнее знак. Обладатель родинки на правой щеке вряд ли узнает в своей жизни нужду. На губах указывает на жизнерадостный и легкий характер, а также на сильную чувственность. Крупная родинка на нижней губе усиливает этот показатель, особенно у женщин. Родинка на верхней губе корректирует излишнюю чувственность тонким вкусом и хорошим воспитанием. На челюсти предупреждает о изначально слабом здоровье. Такому человеку следует внимательнее относиться к себе. На подбородке означает, что человек будет довольно удачлив во всех начинаниях. На шее, особенно на горле, считается одним из наиболее благоприятных знаков. Скорее всего, этого человека ожидает брак, дающий полное финансовое благополучие, или успешная карьера, которая также принесет богатство. На плечах предупреждает о трудностях в жизн��. На груди справа указывает, что это человек может познать превратности судьбы: успех может неожиданно смениться полным крахом, а слава - позором. Если родинка находится слева (особенно у женщин) - этот человек искренен и пылок в любви, но ему лучше быть более осмотрительным, чтобы не столкнуться с разочарованием. Родинка в центре груди говорит о том, что огромное богатство маловероятно, хотя и бедствовать в жизни тоже не придется. На ребрах с любой стороны указывает на скрытую трусость и слабость, которые может сгладить лишь напряженная работа над собой. Также можно предположить лень и некоторую грубоватость, но эти качества смягчаются наличием чувства юмора, особенно если родинка находится справа. Родимое пятно в области живота предупреждает, что человек может оказаться склонен к эгоизму и жадности. На спине - говорит об открытости, добродушии, щедрости человека, который при этом еще любит давать советы, несколько романтичен, смел. На любом из запястий обещает, что человек найдет себе работу по душе и добьется в ней успеха благодаря своим способностям и талантам. На тыльной стороне кисти говорит об исключительных способностях. На бедре - это указание на то, что у человека будут дети с крепким здоровьем (родинки на обоих бедрах усиливают предсказание). На правом колене предвещает счастливый брак. На левом - говорит о том, что у человека эмоции зачастую одерживают победу над разумом. На лодыжках у мужчин указывают на душевную утонченность, в то время как у женщин это знак сильной энергетики и больших способностей. На правой стопе указывает на страсть человека к перемене мест и путешествиям. На левой - говорит о незаурядном интеллекте и сильной интуиции.
7
+ Многие люди периодически жалуются на изжогу, загрудинное жжение и боль. Изжога - один из симптомов целого ряда заболеваний, среди которых, наверное, самое распространенное - гастрит. Человек может испытывать неприятные ощущения также при язвенной и гастроэзофагеальной болезнях и в других случаях. Причин возникновения изжоги много, но механизм возникновения болезненных ощущений один. В норме пища через пищевод попадает в желудок. Их разделяет так называемый кардиальный сфинктер - мышечное кольцо, задача которого пропустить пищу сверху вниз и предотвращать попадание в пищевод кислого содержимого желудка снизу вверх. Но если по каким-то причинам сфинктер не срабатывает, содержимое желудка раздражает пищевод и человек ощущает жжение и боль. Если приступы возникают часто и регулярно, необходим визит к врачу, который назначит необходимые исследования. К какому врачу обращаться? Не праздный вопрос. Дело в том, что чувство жжения за грудиной может быть проявлением заболеваний сердца и сосудов. Оно характерно для стенокардии, иногда возникает вследствие повышенного артериального давления. Определить, пищеварительная изжога мучает пациента или сердце, поможет нитроглицерин. Если после его приема жжение уменьшается, следует посетить кардиолога. Когда изжога случается пару раз в год, то особо беспокоиться не стоит. Скорее всего, причины в неправильном питании, злоупотреблении острой или жирной пищей, алкоголем. Располагающие к изжоге факторы - избыточный вес и пожилой возраст. У некоторых болезненные ощущения могут вызвать кислые фрукты - лимоны, яблоки, сливы и другие продукты, содержащие кислоту, в том числе кефир и некоторые сорта черного хлеба. Загрудинное жжение может возникнуть внезапно при поднятии тяжестей. В этом случае резко возрастает внутрибрюшное давление и становится возможен выброс желудочного содержимого в пищевод. Народные средства борьбы с изжогой - сода, мел, активированный уголь, отвар льняного семени. Хорошо помогает обычное свежее (не кислое) молоко. Но простые средства действуют только на симптом, если же он - спутник заболевания, необходимо лечение, назначенное специалистом. При отсутствии заболеваний для борьбы с изжогой медики советуют принимать любые препараты, уменьшающие секрецию желудочного сока. Это группа лекарств на основе солей алюминия, обладающих обволакивающим действием, защищающих слизистые оболочки пищевода и желудка. Непосредственно на желудочную секрецию действуют Н2-блокаторы и блокаторы протонной помпы, в комплексе с которыми применяют лекарства, регулирующие моторику желудочно-кишечного тракта. Чтобы не провоцировать изжогу, нужно соблюдать правильный режим питания. Есть помалу и часто, пять-шесть раз в сутки, не допуская переедания и переполнения желудка. После еды лучше погулять или постоять, в крайнем случае, посидеть, но никак не ложиться вздремнуть, "чтобы жирок завязался", чем грешат многие наши сограждане. Желательно исключить из рациона или максимально ограничить потребление продуктов, способствующих метеоризму - ржаного хлеба, бобовых, капусты и газированных напитков. Продукты, способствующие увеличению выработки желудочного сока, среди которых жареные блюда и наваристые бульоны, совсем не способствуют здоровому самочувствию и могут вызывать приступы изжоги. Организм человека не может существовать без поступления извне питательных веществ. Постарайтесь не употреблять вместе с ними те, которые вызывают
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ argparse
2
+ pymorphy3
3
+ pymorphy3-dicts-ru
4
+ termcolor
train.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import re
3
+ from pprint import pprint
4
+
5
+ from classes import Token
6
+ from datamanager import models
7
+ from utils import progressbar
8
+ from datamanager import get_texts, set_data, get_data, set_data_v2
9
+
10
+ turbo = False
11
+
12
+ def process_sentence(db, db2, sentence, text):
13
+ words = sentence.strip().split()
14
+ for i in range(len(words) - 2):
15
+ word = words[i].strip()
16
+ next_word = words[i + 1]
17
+ token = Token(word, next_word, text, sentence, turbo)
18
+ if token not in db:
19
+ db.append(token)
20
+ for context in token.contexts:
21
+ if context not in db2:
22
+ db2[context] = []
23
+ db2[context].append(token)
24
+
25
+ def process_text(db, db2, text):
26
+ sentences = re.findall(r'[^.!?]+[.!?]+', text.lower())
27
+ total_sentences = len(sentences)
28
+ j = 0
29
+ for sentence in sentences:
30
+ j += 1
31
+ progressbar(j, total_sentences, length=25)
32
+ process_sentence(db, db2, sentence, text)
33
+
34
+ def train(model_name):
35
+ db = []
36
+ db2 = {}
37
+ print(f'Rebuilding database for "{model_name}"...')
38
+ k = 0
39
+ texts = get_texts(model_name)
40
+ total_texts = len(texts)
41
+ for text in texts:
42
+ k += 1
43
+ print(f'Processing text {k} of {total_texts}...')
44
+ process_text(db, db2, text)
45
+
46
+ set_data(model_name, db)
47
+ models[model_name]["db"] = db
48
+ set_data_v2(model_name, db2)
49
+ models[model_name]["db2"] = db2
50
+
51
+ if __name__ == '__main__':
52
+ parser = argparse.ArgumentParser(
53
+ prog='Text Generator v2',
54
+ description='Generates text from a text file')
55
+ parser.add_argument('-r', '--rebuild', action='extend', nargs="+", type=str)
56
+ parser.add_argument('-l', '--log', action='extend', nargs="+", type=str)
57
+ parser.add_argument('-t', '--turbo', action='store_true')
58
+ args = parser.parse_args()
59
+
60
+ if args.rebuild:
61
+ for model in args.rebuild:
62
+ if model not in models:
63
+ raise ValueError("Model '%s' not found" % model)
64
+ turbo = args.turbo
65
+ train(model)
66
+ if args.log:
67
+ for model in args.log:
68
+ if model not in models:
69
+ raise ValueError("Model '%s' not found" % model)
70
+ pprint(get_data(model))
utils.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from termcolor import colored
2
+
3
+ def log(text):
4
+ '''The function logs a given text to a file named 'log.log'.
5
+
6
+ Parameters
7
+ ----------
8
+ text
9
+ The text that will be written to the log file.
10
+
11
+ '''
12
+ print(text, file=open('log.log', 'a+'))
13
+
14
+ # Print iterations progress
15
+
16
+
17
+ def progressbar(iteration, total, prefix='', suffix='', decimals=1, length=100, fill=colored('█', 'green'), print_end="\r"):
18
+ """
19
+ Call in a loop to create terminal progress bar
20
+ @params:
21
+ iteration - Required : current iteration (Int)
22
+ total - Required : total iterations (Int)
23
+ prefix - Optional : prefix string (Str)
24
+ suffix - Optional : suffix string (Str)
25
+ decimals - Optional : positive number of decimals in percent complete (Int)
26
+ length - Optional : character length of bar (Int)
27
+ fill - Optional : bar fill character (Str)
28
+ printEnd - Optional : end character (e.g. "\r", "\r\n") (Str)
29
+ """
30
+ percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
31
+ filled_length = int(length * iteration // total)
32
+ bar = fill * filled_length + colored('-', 'red') * (length - filled_length)
33
+ print(f'\r{prefix} [{bar}] {percent}% ({iteration}/{total}) {suffix}', end = print_end)
34
+ # Print New Line on Complete
35
+ if iteration == total:
36
+ print()