1.4.5. Нейронная сеть genism.doc2vec
Встраивание (вхождения) слов или на английском Word Embeddings на сегодня является наиболее используемым методом обработки естественного языка (NLP). Метод вхождения слов способен улавливать как семантическое, так и синтаксическое сходство слов и взаимосвязь слов с другими словами. Метод широко используется для систем классификации текста. Данный метод изображен на рисунке 1.
Рисунок 1 – Нейронные слои doc2vec [7]
30
Doc2vec использует двухслойную нейронную сеть:
- на входном слое слова кодируются в формате one-hot (каждое слово кодируется бинарным вектором, где каждая единица обозначает позицию слова в словаре);
- второй слой Embedding - представляет из себя матрицу N x P, где N - размер словаря, P - параметр, подбираемый экспериментально 300;
- выходной слой является матрицей, размером N x 1. Каждый нейрон на данном слое выдает вероятность принадлежности слова к соответствующему контексту (softmax).
Схема выходного слоя представлена на рисунке 2.
Рисунок 2 – Выходной слой softmax [7]
31
2. Расчетно-конструкторская часть
2.1. Проектирование архитектуры системы
Для разработки архитектуры системы необходимо определить какие данные система будет получать на входе и выдавать на выходе.
Входными данными являются настройки, задаваемые пользователем с одной стороны, и новостные сообщения из различных Telegram каналов с другой стороны.
Выходными данными являются сообщения с новостями, направляемые пользователю в соответствии с его фильтрами и подписками. Сообщения система получает от различных Telegram каналов, и отправляет списку подключенных к системе пользователей, при этом у каждого пользователя есть возможность добавить для канала слова
–
исключения. Список пользователей, каналов и исключений сохраняются в базе данных.
В приложении А представлена полная архитектура системы, далее в текущем разделе рассмотрены и описаны все части системы отдельно [8].
2.1.1. TelegramBot server
TelegramBot Server отвечает за взаимодействие с пользователем, получает от него сообщения, настройки и направляет в ответ новости. Чат между ботом и пользователе уникальный для каждого пользователя.
Настройки, переданные пользователем, сохраняются в базу данных. В ходе эксплуатации бота пользователей может посмотреть или редактировать сохраненные настройки.
Так как TelegramBot Server не может подписываться на каналы
(ограничения Telegram), то для передачи сообщений от выбранных пользователем каналов пользователю через бот необходим промежуточный сервер, который будет подключен ко всем каналам, выбранными всеми пользователями – данным посредником является TelegramClient Server.
Исходный код TelegramBot Server продемонстрирован в Приложении Б.
32
2.1.2. База данных База данных взаимодействует с
TelegramBot Server и
TelegramClient Server. TelegramBot Server записывает в базу данные и имеет доступ на редактирование.
TelegramClient Server только читает данные из базы данных, имеет доступ на чтение.
В Обзорной части были рассмотрены различные системы управления базами данных, по результатам сравнения выбор пал на
PostgreSQL. На этапе проектирования архитектуры системы имеет значение будет ли база данных реляционной или «
NoSQL».
PostgreSQL является реляционной базой данных, но так же имеет возможность хранить данные формата
JSON. База
данных развернута как отдельный сервер, и является отдельным элементом в архитектуре системы.
Аспекты разработки структуры базы данных рассмотрены в разделе 2.2.
2.1.3. TelegramClient serverTelegramClient Server подписывается на полный список каналов и пересылает все новости в сервисный чат –
Service News Group.
TelegramBot Server отвечает за взаимодействие с пользователем и направляет ему новости в соответствии с настроенными фильтрами.
В Обзорной части были описаны аспекты взаимодействия с платформой
Telegram для
TelegramBot и
TelegramClient, так как
TelegramClient по сути является роботизированным пользователем, для аутентификации данного пользователя требуется наличие номера телефона, пароля и смс подтверждения входа, в последствии сессия храниться в файле с расширением
session и повторное подтверждение уже не требуется.
Исходный код
TelegramBot Server продемонстрирован в Приложении В.
33
2.1.4. Модуль анализа схожести новостей
Анализ схожести новостей производится с помощью обученной модели нейронной сети. При получении новой новости модуль производит сравнения новости с списком уже имеющихся новостей для поиска совпадений. При нахождении аналогичных новостей из разных источников нет смысла направлять пользователю уведомление о новой новости, в таком случае уже полученное пользователем сообщение обновляется (редактируется) и к сообщению добавляется ссылка на еще один источник. В архитектуре системы данный модуль будет располагаться на TelegramClient Server. Данной расположение обусловлено особенностями работы системы, тем что каждая новая новость должна быть обработана модулем.
После обработки новости ботом для каждой новости задается ее векторное представление. Векторное представление текста необходимо для машинного поиска схожести новостей. Далее векторное используется для поиска схожести текущей новости с предыдущими и текущей новости с последующими.
Аспекты разработки и обучения нейронной сети рассмотрены далее в разделе 2.4.
2.1.5. Модуль фильтрации новостей
Модуль фильтрации новостей предназначен для самостоятельной настройки пользователем интересующих и недопустимых для него тем новостей.
Пользователь указывает ключевые слова для включения или исключения из его информационной ленты.
При обработки ключевых слов применяется дополнительная обработка заданных слов, позволяющая не учитывать регистр и форму слова. При сравнении полупившей новости и заданных пользователем ключевых слов все слова как в новости, так и заданные пользователем приводятся в нижний регистр и начальную форму слова, что позволяет максимально покрыть потребности пользователя.
34
Так как обработка фильтров индивидуальна для каждого пользователя и даже при одинаковом списке подписок на каналы.
2.2. Разработка структуры базы данных
2.2.1. Определение сущностей
При разработке структуры базы данных учитывается предметная область разрабатываемой системы, требования и ограничения других элементов архитектуры и планы по расширению и усовершенствованию системы.
База данных напрямую взаимодействует с TelegramClient Server и
TelegramBot Server, TelegramBot Server получает и передает всю информацию от пользователей, а TelegramClient Server является только потребителем данных.
При анализе предметной области можно выделить следующие сущности:
Пользователь (User), Канал (Channel). Свойства указанных сущностей уже в значительной степени предопределены платформой Telegram, поэтому можно обратиться к документации платформы. Свойства сущностей представлены в таблицах 3 и 4.
Таблица 3 – Свойства сущности пользователь (User) в Telegram
Атрибут
Описание contact
Whether this user is a contact mutual_contact
Whether this user is a mutual contact deleted
Whether the account of this user was deleted bot
Is this user a bot? bot_chat_history
Can the bot see all messages in groups? verified
Whether this user is verified
35
Продолжение таблицы 3 bot_inline_geo
Whether the bot can request our geolocation in inline mode support
Whether this is an official support user scam
This may be a scam user fake
If set, this user was reported by many users as a fake or scam user: be careful when interacting with them. id
ID of the user first_name
First name last_name
Last name username
Username phone
Phone number photo
Profile picture of user status
Online status of user lang_code
Language code of the user
36
Таблица 4 – Свойства сущности пользователь (Channel) в Telegram
Атрибут
Описание creator
Whether the current user is the creator of this channel left
Whether the current user has left this channel broadcast
Is this a channel? verified
Is this channel verified by telegram? scam
This channel/supergroup is probably a scam has_link
Whether this channel has a private join link has_geo
Whether this chanel has a geoposition slowmode_enabled
Whether slow mode is enabled for groups to prevent flood in chat call_active
Whether a group call or livestream is currently active call_not_empty
Whether there's anyone in the group call or livestream fake
If set, this supergroup/channelwas reported by many users as a fake or scam: be careful when interacting with it. noforwards
Whether this channel or group is protected, thus does not allow forwarding messages from it id
ID of the channel title
Title username
Username
37
Продолжение таблицы 4
Атрибут
Описание photo
Profile photo date
Date when the user joined the supergroup/channel, or if the user isn't a member, its creation date restriction_reason
Contains the reason why access to this channel must be restricted. admin_rights
Admin rights of the user in this channel (see rights) banned_rights
Banned rights of the user in this channel (see rights) participants_count
Participant count
Однако не все данные, указанные в документации платформы нам необходимо хранить в базе данных на собственном сервере, мы в любой момент можем обратиться к платформе и получить текущую, актуальную информацию.
Неизменным и необходимым полем является user_id – это уникальный номер пользователя. Так же решено хранить user_name пользователя, несмотря на то, что это необязательное поле и может изменяться пользователем в течении времени данное поле может быть крайне удобно в случае ручного администрирования базы данных, данное поле позволит опознать человека в мобильном приложении Telegram.
Кроме описанных полей нужно выделить атрибуты сущностей, необходимые для нормального функционирования системы с учетом планов по расширению системы [9].
38
2.2.2. Расширение системы Планируется расширение функциональности системы для пользователей, оформивших подписку. Расширение функциональности будет касаться количества фильтров, которые пользователь сможет настроить, чтобы получать новости на разные темы, например, настроить необходимые для работы новости отдельно от общего потока новостей. Для реализации данного
расширения можно использовать еще одну сущность, присутствующую на платформе
Telegram, это «Групповой чат». Групповой чат позволяет нескольким пользователям обмениваться сообщениями друг с другом одновременного, кроме того в групповой чат может быть добавлен
TelegramBot. Использую данную возможность можно заложить в структуру базы данных пространство для расширения системы, определить сущность Новостная группа (
News Group).
Через Новостную группу пользователь сможет настроить несколько различных наборов фильтров, ограничение по количеству таких групп будет сохранено для каждого пользователя как атрибут к сущности Пользователь.
Атрибутами сущности Новостная группа являются уникальная связка
user_id и
newsgroup_id, эта связка является первичным ключом. Для ограничения максимальной необходимой мощности системы принято решения ограничить максимальное число каналов, на которые можно подписаться для каждой группы, атрибут
max_channels. Для сохранения фильтров, заданных пользователем принято решение использовать не реляционные возможности базы данных
PostgreSQL, формат сохранения данных,
JSONB. Данный формат упростит процесс внесения изменения фильтров пользователем в течение эксплуатации системы.
39
2.2.3. Построение атрибутной модели
Учитывая все рассмотренные сущности и их атрибуты можно построить атрибутную модель базы данных. В модели будут присутствовать 3 сущности со следующими отношениями:
- пользователь – групповой новостной чат (один ко многим);
- групповой новостной чат – каналы (один ко многим).
Опианная модель представлена на рисунке 3.
Рисунок 3 – Структура базы данных
В модели используется формат данных JSONB, данный формат имеет структуру данных внутри себя. Атрибут filters хранит все указанные пользователем фильтры интересуемых (include) и недопустимых (exclude) ключевых слов.
Структура filters JSONB представлена в листинге 1.
Листинг 1 – Структура данных filters (jsonb)
{ include:
[
“keyword1”,
“keyword2”,
], exclude:
[
“keyword1”,
40
“keyword2”,
]
}
2.2.4. Создание и настройка базы данных
В соответствии с построенной атрибутной моделью база данных создается на рабочей машине. Для создания базы данных используется стандартная консольная утилита psql, свободно поставляемый вместе с СУБД PostgreSQL.
Первоначальная авторизация происходит под пользователем «postgre», без пароля, после чего создаются пользователь и база данных для конкретного проекта. После авторизации в созданную базу данных под новым пользователем можно приступать к созданию таблиц.
Команды создания таблиц представлены в листингах 2, 3, 4.
Листинг 2 – SQL команда на создание таблицы User
CREATE TABLE User ( user_id int, user_name str, bot_status bool, subscribe_status bool, max_groups int)
Листинг 3 – SQL команда на создание таблицы NewsGroup
CREATE TABLE NewsGroup ( user_id int, newsgroup_id int, max_channels int, filters, jsonb)
Листинг 4 – SQL команда на создание таблицы Channels
CREATE TABLE Channels ( user_id int,
41 newsgroup_id int, channel_id int)
2.2.5. Создание оболочки взаимодействия
Для удобства обращения к базе данных при выполнении основного кода
TelegramBot Server и TelegramClient Server разработаны оболочки обращений.
Оболочка является функцией в python, позволяющей при необходимости обратиться к базе данных не составлять SQL запрос, а воспользоваться стандартными заложенными командами.
Программный код оболочки представлен на листинге 5.
Листинг 5 – Код оболочки взаимодействия с базой данных
from peewee import *
from .db_settings import db_name, port, password, user, host, default_channel_limit db
=
PostgresqlDatabase(db_name, user=user, password=password, host=host, port=port)
class Group(Model): group_id
=
IntegerField(unique=True, primary_key=True) user_id = IntegerField(unique=False) max_channels
=
IntegerField(unique=False, default=default_channel_limit) custom_filter = TextField(default='')
class Meta: database = db
class User(Model):
"""
Пользователь телеграмм бота id: IntegerField - Айди аккаунта в телеграмм боте """ id = IntegerField(unique=True, primary_key=True, default=0)
42 name = CharField(default='Нет имени') not_banned = BooleanField(default=True) max_channels
=
IntegerField(unique=False, default=default_channel_limit) custom_filter = TextField(default='') subscribe = TextField(default='')
class Meta: database = db
class Link(Model):
"""
Пользователь телеграмм бота channel_link : TextField - ссылка на бота channel_name: TextField - имя бота filter: TextField - фильтры для слов user : ForeignKey - связь один ко многому с пользователем """ id = AutoField() channel_link = TextField(unique=False) channel_name = TextField(unique=False, null=True) custom_filter = TextField(null=True) user = ForeignKeyField(User, backref='links')
class Meta: database = db
class News(Model): id = AutoField() edit_text = TextField() channel_name = TextField() text = TextField() lm_text = TextField() attachs = TextField() date = DateTimeField() sent = TextField()
class Meta: database = db db.connect() db.create_tables([User, Link, News])
43
2.3. Разработка нейронной сети 2.3.1. Обучение нейронной сети В П.1 части приведено сравнения различных методов поиска схожих текстов, в качестве наиболее подходящего к поставленной задачи выбран метод векторизации абзацев текста
doc2vec в
python библиотеке
genism. Данный метод позволяет преобразовать
текстовую информацию в векторную форму, при этом векторная форма будет отображать именно смысловую нагрузку, которую несет текст и не зависит от отдельных слов, синонимов которыми она представлена.
Для работы нейронной сети необходимо предварительно создать модель, то есть обучить нейронную сеть [10].
При разработке структуры базы данных учитывается предметная область разрабатываемой системы, требования и ограничения других элементов архитектуры и планы по расширению и усовершенствованию системы.
База данных напрямую взаимодействует с
TelegramClient Server и
TelegramBot Server, TelegramBot Server получает и передает всю информацию от пользователей,
а TelegramClient Server является только потребителем данных.
Первым этапом обучение нейронной сети является сбор набора данных
(датасета). Чем больше датасет, тем выше будет точность работы нейронной сети
(модели).
Модель обучалась на большом датасете русскоязычных новостей, собранном из двух датасетов на
kaggle.com: Russian News 2020 и News Dataset from Lenta.Ru. Корпус содержит тексты из четырёх источников:
lenta.ru, ria.ru, meduza.io и
tjournal.ru с сентября 2014 по декабрь 2020. Для всех новостей сохранены тэги, которые были им проставлены на новостном сайте.
Вторым этапом является приведение исходных текстовых данных в датасете к форме, пригодной для обработки нейронной сетью.
Все тексты в датасете очищены от пунктуации и спец-символов, лемматизированы (слова приведены к начальной форме), удалены стоп-слова
(слова, чаще всего встречающиеся в русском языке).
44
Приведение слов к начальной форме является отдельной сложной задачей.
Однако решение данной задачи выполнено командой
Yandex. Для предобработки и лемматизации (приведению к начальной форме) текстов использованы библиотеки
nltk и
pymystem3 (оболочка над морфологическим анализатором
Yandex Mystem). Для лемматизации новостей в самом боте использован морфологический анализатор
pymorphy2. Причина различного выбора библиотек –
pymorphy2 работает быстрее на коротких текстах, а
pymystem3 – на длинных текстах и больших объёмах данных.
Объём всего датасета составил: 1,81 Гб в виде
csv-файла, 795421 текст.