Файл: Разработка информационной системы персонализации новостной ленты на базе платформы Telegram.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 27.03.2024
Просмотров: 30
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
25 обеспечения, но при этом уступает второму в скорости работы и надежности.
При реализации системы возможно сочетать оба способа хранения данных, например, для данных, которые требует частого и быстрого обновления, чтения и записи необходима база данных. Для данных которые записываются однократно и не требуют постоянного обновления, например, конфигурационные данные, данные настроек системы, может быть использовано хранение в файловой системе.
Распространенными форматами для хранения в файловой системе являются форматы JSON и XML. Формат XML удобен в том числе возможностью редактирования файла через программу Excel.
Для реализации хранения данных с помощью базы данных требуется установка системы управления базами данных
(СУБД).
СУБД классифицируются по модели хранимых данных:
Иерархическая модель данных – в данной модели используется представление данных в виде древовидной структуры.
Сетевая модель данных – модель на базе иерархической структуры, где для данных различных уровней определен математический принцип.
Реляционная модель данных – модель данных основанная на теории множеств и логике первого порядка.
Объектно-ориентированная модель данных – модель данных, где данные обрабатываются как абстрактные объекты, наделенные свойствами.
Наиболее распространенным является реляционная модель данных, она подходит для большинства задач [5].
Сравним системы управления базами данных по следующим параметрам:
скорость работы;
простота настройки СУБД;
тип лицензии;
доступность на разных ОС (кросс-платформенность);
востребованность;
тип СУБД.
26
Результаты сравнения приведены на таблице 2.
Таблица 2 – Сравнение систем управления базами данных
Скорость
Прос- тота
Лицензия
Доступ- ность на разных
ОС
Востребо- ванность
Тип
Oracle
10 5
Проприетарная
+
10
Реляционная
MySQL
7 9
Открытая
+
9
Реляционная
Microsoft
SQL
6 6
Проприетарная
-
8
Реляционная
PostgreSQL
9 10
Открытая
+
7
Реляционная
MongoDB
6 7
Открытая
+
4
Документоори- ентированная
Для реализации системы следует производить выбор среди бесплатных
СУБД, это MySQL, PostgreSQL и MongoSQL.
1.3.3. Размещение сервера
Обеспечить серверные мощности возможно самостоятельно закупив оборудование или арендуя его.
При самостоятельной закупке серверного оборудования возможно сэкономить на относительной стоимости единицы мощности сервера (под мощностью сервера имеется в виду совокупность его характеристик как производительность центрального процессора, объемы оперативной и стационарной памяти и т.д.), но при этом будет необходимо нести высокие эксплуатационные издержки. В эксплуатационные издержки входит оплата энергии, оплата статического ip-адреса, работы по настройке и ремонту оборудования.
27
При аренде серверных мощностей относительная стоимость единицы мощности будет выше, так же будут выше ежемесячные платежи. При этом отсутствует необходимость в эксплуатации и ремонте оборудования, отсутствуют капитальные затраты и присутствует возможность увеличения мощностей в короткие сроки или даже моментально.
Компании в отдельных предоставляют серверные мощности в аренду, так же их называют облачные сервера, без взимания платы за пользования. Обычно такая услуга доступна для серверов, использующих малый объем мощностей, например, Google Cloud позволяет бесплатно использовать виртуальную машину с характеристиками 1 ядро 614 Мб оперативной памяти и 10 Гб постоянной.
Данный вариант лучшим образом подойдет для реализации ВКР.
1.4. Выбор технологии анализа схожести новостей
1.4.1. Сходство Жаккара
Для реализации поставленной задачи необходимо определить метод, с помощью которого система будет определять факт того, что новости в разных источниках одинаковые. Для определения схожести текстов есть несколько методов.
Метод основан на подсчете общего количество элементов в последовательности, чем больше общих элементов, тем выше сходство
????
????
=
????
????+????−????
,
(1) где а – количество видов на первом множестве; b – количество видов на втором множестве; с – количество видов, общих для первого и второго множеств.
Данный метод будет удобен для поиска копии документа, но в случае поиска новости похожей по смыслу, но написанной другими словами, синонимами результат будет не такой качественный [6].
28
1.4.2. Алгоритм шинглов
Алгоритм использует схожую логику с Сходством Жаккера, но также используется «шинглы». Шинглы это последовательности слов. Алгоритмов состоит из следующих этапов: приведение к нормальной форме, разбиение на шинглы, вычисление контрольных сумм шинглов, случайная выборка контрольных сумм и сравнение.
Минусом данного метода так же является направленность на вычисление копий текста, но не схожих по смыслу.
1.4.3. Расстояние Левенштейна
В данном методе вычисляется минимальное количество операций, необходимых для преобразования одной строки в другую.
Данный метод активно применяется для исправления ошибок в слове или для сравнения текстовых файлов на предмет редактирования.
1.4.4. Векторное сходство TF-IDF
Первый векторный метод, появился еще в 1970х годах. Метод основан на двух компонентах rm Frequency (TF) и Inverse Document Frequency (IDF).
В TF подсчитывается отношение числа вхождений слова к общему числу слов в документе.
В IDF подсчитывается инверсия частоты вхождения слова к частоте, с которой данной слово встречается во всем документе.
Такой подход позволяет задавать больший вес уникальным словам и обесценивать междометия и слова связки, часто встречающиеся в тексте.
Для того что бы создать из текста вектор вычисление TF-IDF для каждого слова в векторе, затем из полученных значений составляется вектор. Анализ схожести текста производится по вычислению косинуса разности между векторами.
29
1 2 3 4
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 server
TelegramClient 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 текст.
1 2 3 4
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 server
TelegramClient 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 текст.
1 2 3 4
2.3.2. Интеграция модуля анализа схожести новостей
Обученная модель позволяет вычислять числовой вектор для каждой текстовой новости. Полученный числовой вектор уже может быть использован для сравнения новостей. Каждая поступившая новость сравнивается с уже имеющимися посредством вычисления косинусной разницы между векторами, если косинусная разница меньше чем определенное значение, то новости считаются одинаковыми.
Программный код модуля анализа схожести новостей представлен на листинге 6.
Листинг 6 – Код модуля анализа схожести новостей.
from string import punctuation
from typing import List
import nltk
from gensim.models.doc2vec import Doc2Vec
from nltk.corpus import stopwords
from pymorphy2 import MorphAnalyzer nltk.download('stopwords') russian_stopwords = stopwords.words('russian') punctuation += '«»'
Обученная модель позволяет вычислять числовой вектор для каждой текстовой новости. Полученный числовой вектор уже может быть использован для сравнения новостей. Каждая поступившая новость сравнивается с уже имеющимися посредством вычисления косинусной разницы между векторами, если косинусная разница меньше чем определенное значение, то новости считаются одинаковыми.
Программный код модуля анализа схожести новостей представлен на листинге 6.
Листинг 6 – Код модуля анализа схожести новостей.
from string import punctuation
from typing import List
import nltk
from gensim.models.doc2vec import Doc2Vec
from nltk.corpus import stopwords
from pymorphy2 import MorphAnalyzer nltk.download('stopwords') russian_stopwords = stopwords.words('russian') punctuation += '«»'
45 morph = MorphAnalyzer() model = Doc2Vec.load('model')
def preprocess_text(text: str) -> List[str]:
'''
Preprocesses a text: strips punctuation, converts text to lowercase, removes stopwords, tokenizes and lemmatizes text.
Parameters: text: str
Returns: str
''' tokens
=
[morph.parse(word.strip(punctuation))[0].normal_form
for word in text.lower().split()]
return [token for token in tokens if token not in russian_stopwords]
def are_news_same(article_1: str, article_2: str) -> bool: success
= model.similarity_unseen_docs(preprocess_text(article_1), preprocess_text(article_2))
if success >= 0.5:
return True
return False
2.4. Сценарии использования и интерфейс
2.4.1. Подписка на источники
Разрабатываемая система предназначена для получения новостей в одной ленте из различных источников, фильтрации новостей и уменьшения количества уведомлений за счет обнаружения повторных новостей. Можно выделить два основных действия, совершаемых пользователем, это подписка на источники новостей (каналы) и назначение фильтров.
46
Для подписки на новостной источник пользователю необходимо направить в бот ссылку на канал. Ссылки на каналы в Telegram имеют следующий вид: https://t.me/channelname.
В таком случае сценарий имеет следующий вид:
- команда «Добавить канал»;
- направление ссылки на канал;
- обратная связь после внесения канала в список подписок.
Интерфейс реализации описанного выше сценария представлена на рисунке 4.
47
Рисунок 4 – Интерфейс добавления каналов
2.4.2. Редактирование фильтров
Для назначения фильтров пользователю необходимо направить в бот ключевые слова, которые необходимо либо исключить из новостной ленты, либо наоборот включить в ленту. Данные слова можно обозначить знаками «+» или