Пишем простую нейросеть
https://t.me/nuancesprog
Есть множество разных видов нейросетей, и целей для которых они служат. В общем случае схема работы нейросети такова:
- Создают программу используя библиотеки для построения нейросетей
- Обучают программу на БОЛЬШОМ наборе данных, то есть дают ей набор данных, правильно размеченный человеком, чтобы нейросеть обучилась и начала работать на других похожих наборах данных
- Сохраняют и используют обученную нейросеть
В примере совместил обучение нейросети вместе с ее тестированием, поэтому при каждом запуске нейросеть сперва обучается(что занимает некоторое время, не думайте что программа зависла). Если вы захотите использовать данный пример в своих проектах то разделите скрипт на две части - первая будет обучать модель и сохранять её, а вторая работать на основе уже сохраненной модели. Подробнее о сохранении и загрузке моделей можно почитать тут.
К тому же в моем примере я буду использовать очень маленький набор данных, в реальных проектах набор данных должен быть минимум из нескольких тысяч строк.
Итак, мы создадим нейросеть которая пытается угадать какой тип контента нужно найти для пользователя, в ответ на его вопрос. Например, если юзер спросит "Кто такой Виктор Цой", нейросеть должна ответить "Информация о личности". Она не будет отвечать на вопрос, просто классифицирует вопрос в определенную категорию. Обучающий набор данных очень маленький поэтому тестировать будем на более-менее похожих вопросах.
Сперва создадим набор данных для обучения. У меня это обычный текстовый файл в котором лежат строки, разделенные значком @. Назовите файл 1.txt и киньте рядом со скриптом нейросети. Используйте кодировку UTF-8.
Что такое патока @ Информация о предмете Где живут медведи @ Местоположение Как зовут сына Трампа @ Имя Как зовут Мадонну @ Имя Как зовут Бьорк @ Имя Кто начал ядерную войну @ Имя Как зовут сына Сталина @ Имя Как зовут дочь Трампа @ Имя Почему небо голубое @ Информация о предмете Как сварить борщ @ Инструкция Как научиться летать @ Инструкция Как рано просыпаться @ Инструкция Как обрести счастье @ Инструкция Как найти парня @ Инструкция Как убить таракана @ Инструкция Сколько звезд на небе @ Количество Кто такая Мадонна @ Информация о личности Какая высота у Эйфелевой башни @ Количество Дата рождения Путина @ Дата рождения Когда началась вторая Мировая война @ Дата события Когда родился Майкл Джексон @ Дата рождения Почему идет дождь @ Информация о предмете В каких фильмах играл Ди Каприо @ Информация о предмете Когда родился Эйнштейн @ Дата рождения Когда началась Первая мировая война @ Дата В каком году был построен Титаник @ Дата Когда начал править Иван IV @ Дата Когда была битва под Аустерлицем @ Дата В каких годах была «Семилетняя война» @ Дата Когда начал править Наполеон Бонапарт @ Дата Когда закончилось правление Наполеона Бонапарта @ Дата В каких годах правил князь Святослав @ Дата В каком году умер Ярослав Мудрый @ Дата В каком году появляется первое упоминание о Москве @ Дата В каком году был основан Санкт-Петербург @ Дата Когда было Ледовое побоище @ Дата Когда была Куликовская битва @ Дата В каком году начали печатать книги на Руси @ Дата Когда была Полтавская битва @ Дата В каком году закончилась Первая мировая война @ Дата В каком году был заключен Тильзитский мир @ Дата В каком году были написаны «Отцы и дети» @ Дата Когда родился Вильгельм Фридрих Людвиг фон Пройсен @ Дата Когда отмечается День Учителя @ Дата Когда отмечается День Матери @ Дата Когда отменили крепостное право @ Дата Что произошло 12 июня 1812 @ Дата Что произошло 20 ноября 1805 @ Дата Что произошло 6 июня 1799 @ Дата Что произошло 1 апреля 1809 @ Дата Какой город начинает упоминатся с 1147 грода @ Дата Кто такой Эйнштейн @ Информация о личности Кто такие Eluveitie @ Информация о личности Что такое «дождь» @ Информация о предмете Кто основал Санкт-Петербург @ Имя Кто такой Христофор Колумб @ Информация о личности Как звали Колумба @ Имя Кто написал произведение «Преступление и наказание» @ Имя Кто написал стихотворение «Тройка» @ Имя Какой страной управляет королева Елизавета II @ Местоположение Какова средняя глубина Тихого океана @ Количество Какова высота Биг Бена @ Количество Где находится Сиднейская Опера @ Местоположение Где находится самое большое озеро @ Местоположение В какой стране столицей является город Москва @ Местоположение
Теперь покажу сам скрипт нейросети для классификации вопросов. Я не буду подробно расписывать как установить через pip все нужные для нейросети модули. Скажу лишь что PyStemmer нужно скачать и установить в формате whl. Если у вас скрипт ругается на отсутствие какого-то модуля, ставьте модуль через pip.
# -*- coding: utf-8 -*-
import sys
import numpy as np
import re
from Stemmer import Stemmer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline
# очистка текста с помощью regexp приведение слов в инфинитив и нижний регистр, замена цифр
def text_cleaner(text):
text = text.lower() # приведение в lowercase
stemmer = Stemmer('russian')
text = ' '.join(stemmer.stemWords(text.split()))
text = re.sub(r'\b\d+\b', 'digit', text) # замена цифр
return text
# загрузка данных из файла 1.txt
def load_data():
data = {
'text':[],
'tag':[]
}
for line in open('1.txt'):
if(not('#' in line)):
row = line.split("@")
data['text'] += [row[0]]
data['tag'] += [row[1]]
return data
# Обучение нейросети
def train_test_split(data, validation_split=0.1):
sz = len(data['text'])
indices = np.arange(sz)
np.random.shuffle(indices)
X = [data['text'][i] for i in indices]
Y = [data['tag'][i] for i in indices]
nb_validation_samples = int(validation_split*sz)
return {
'train': {
'x': X[:-nb_validation_samples],
'y': Y[:-nb_validation_samples]},
'test': {
'x': X[-nb_validation_samples:],
'y': Y[-nb_validation_samples:]}
}
def openai():
data = load_data()
D = train_test_split(data)
text_clf = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', SGDClassifier(loss='hinge')),
])
text_clf.fit(D['train']['x'], D['train']['y'])
predicted = text_clf.predict(D['train']['x'])
# Начало тестирования программы
z=input("Введите вопрос без знака вопроса на конце: ")
zz=[]
zz.append(z)
predicted = text_clf.predict(zz)
print(predicted[0])
if __name__ == '__main__':
sys.exit(openai())
Давайте запустим нашу нейросеть, подождем пока она обучится (время ожидания зависит от обучающей выборки) и предложит нам ввести вопрос. Введем вопрос которого нет в обучающем файле - "Кто придумал ракету". Писать нужно без знака вопроса на конце. В ответ нейросеть выдаст "Имя", значит она определила что наш вопрос подразумевает ответ в котором должно быть чье-то имя. Заметьте, данного вопроса не было в файле 1.txt, но нейросеть безошибочно определила что мы имеем ввиду, исходя из обучающей выборки.
Данный классификатор очень прост. Вы можете подать на вход в файл 1.txt абсолютно любые данные которые нужно классифицировать, это не обязательно должны быть вопросы и их категории, как в моем примере.
P.S.
Канал Nuances of programming нуждается в переводчиках.
Подробности вы можете узнать написав администратору канала через бота или на почту :)