Как запустить этот код нейросети?

Была статья на хабре:
https://habrahabr.ru/company/dca/blog/274027/

Цитата оттуда:
Очень интересная статья, спасибо! А остальной код где-то на гитхабе?


И вам спасибо за отзыв. Остальной код ничего хитрого из себя не представляет — стемминг и замена одинаковых слов числами по словарику, поэтому я не стал его оформлять. Если интересно — могу выложить,

Почти год прошел, а воз и ныне там.

Все это напоминает мне мем с рисованием совы:
282444.jpg

Вопрос как запустить этот код со всеми текстами, чтобы на выходе получить то что получил автор статьи?
И что-бы можно было написать новый комментарий и посмотреть какую оценку ему даст нейросеть.

update 16 nov

# -*- coding: utf-8 -*-
import string
import json
from nltk.stem.snowball import SnowballStemmer
from keras.preprocessing import sequence
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM


stemmer = SnowballStemmer("russian")

ratio_and_sentence = {
    '0.9945':
    ["""Можно выдыхать спокойно, новые Star Wars олдскульно отличные.
    Абрамс — крутой, как и всегда.
    Сценарий, музыка, актёры и съемка — идеально."""],
    '0.9171':
    ['Всем советую сходить на звездные войны супер фильм'],
    '0.8428':
    ["""СИЛА ПРОБУДИЛАСЬ! ДА ПРИБУДЕТ С ВАМИ СИЛА СЕГОДНЯ НА ПРЕМЬЕРЕ ЧУДА,
    КОТОРОЕ ВЫ ЖДАЛИ 10 ЛЕТ!"""],
    '0.8013':
    ['Хоть и не являюсь поклонницей #StarWars, но это исполнение чудесно!'],
    '0.7515':
    ['Кто сегодня посмотрел звездные войны? я я я :))'],
    '0.6476':
    ['Новые Звездные войны лучше первого эпизода, но хуже всех остальных'],
    '0.6473':
    ['Хан Соло умрёт. Приятного просмотра'],
    '0.6420':
    ['У всех вокруг Звездные войны. Я одна что ли не в теме?'],
    '0.6389':
    ['Идти или не идти на Звездные Войны, вот в чем вопрос '],
    '0.5947':
    ["""Звездные войны оставили двоякие впечатления. И хорошо и не очень.
    Местами не чувствовалось что это те самые… что-то чужое проскальзывало"""],
    '0.3408':
    ["""Вокруг столько разговоров, неужели только я не фанатею по Звёздным
    войнам?"""],
    '0.1187':
    ["""они вырвали мое бедное сердце из грудной клетки и разбили его на
    миллионы и миллионы осколков"""],
    '0.1056':
    ['ненавижу дноклов, проспойлерили мне звездные войны— пижамка найла'],
    '0.0939':
    ['Проснулась и поняла, что новый Star Wars разочаровал'],
    '0.0410':
    ['Я разочарован #пробуждениесилы']
}

idx = 0
words = {}
for ratio, sentence_arr in ratio_and_sentence.items():
        number_arr = []
        sentence = sentence_arr[0]
        table = str.maketrans({key: None for key in string.punctuation})
        sentence = sentence.translate(table)  # Удаляем знаки препинания

        for w in sentence.split():
            w = stemmer.stem(w)
            if w not in words:
                words[w] = idx
                idx += 1
            number_arr.append(words[w])
        sentence_arr.append(number_arr)


print(json.dumps(ratio_and_sentence, ensure_ascii=False, indent=4 * ' '))

max_features = 100000  # Максимальное кол-во слов в частотном словаре
maxlen = 100
batch_size = 32

model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(64, return_sequences=True))
model.add(LSTM(64))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              class_mode="binary")

model.fit(
    X_train, y_train,
    batch_size=batch_size,
    nb_epoch=1,
    show_accuracy=True
)

result = model.predict_proba(X)


Результат работы:
spoiler

Using TensorFlow backend.
{
"0.1187": [
"они вырвали мое бедное сердце из грудной клетки и разбили его на\n миллионы и миллионы осколков",
[
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
8,
12,
13
]
],
"0.6420": [
"У всех вокруг Звездные войны. Я одна что ли не в теме?",
[
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
],
"0.0410": [
"Я разочарован #пробуждениесилы",
[
19,
26,
27
]
],
"0.9171": [
"Всем советую сходить на звездные войны супер фильм",
[
28,
29,
30,
11,
17,
18,
31,
32
]
],
"0.8428": [
"СИЛА ПРОБУДИЛАСЬ! ДА ПРИБУДЕТ С ВАМИ СИЛА СЕГОДНЯ НА ПРЕМЬЕРЕ ЧУДА,\n КОТОРОЕ ВЫ ЖДАЛИ 10 ЛЕТ!",
[
33,
34,
35,
36,
37,
38,
33,
39,
11,
40,
41,
42,
43,
44,
45,
46
]
],
"0.9945": [
"Можно выдыхать спокойно, новые Star Wars олдскульно отличные.\n Абрамс — крутой, как и всегда.\n Сценарий, музыка, актёры и съемка — идеально.",
[
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
8,
59,
60,
61,
62,
8,
63,
56,
64
]
],
"0.7515": [
"Кто сегодня посмотрел звездные войны? я я я :))",
[
65,
39,
66,
17,
18,
19,
19,
19
]
],
"0.6473": [
"Хан Соло умрёт. Приятного просмотра",
[
67,
68,
69,
70,
71
]
],
"0.8013": [
"Хоть и не являюсь поклонницей #StarWars, но это исполнение чудесно!",
[
72,
8,
23,
73,
74,
75,
76,
77,
78,
79
]
],
"0.0939": [
"Проснулась и поняла, что новый Star Wars разочаровал",
[
80,
8,
81,
21,
50,
51,
52,
26
]
],
"0.1056": [
"ненавижу дноклов, проспойлерили мне звездные войны— пижамка найла",
[
82,
83,
84,
85,
17,
86,
87,
88
]
],
"0.5947": [
"Звездные войны оставили двоякие впечатления. И хорошо и не очень.\n Местами не чувствовалось что это те самые… что-то чужое проскальзывало",
[
17,
18,
89,
90,
91,
8,
92,
8,
23,
93,
94,
23,
95,
21,
77,
96,
97,
98,
99,
100
]
],
"0.3408": [
"Вокруг столько разговоров, неужели только я не фанатею по Звёздным\n войнам?",
[
16,
101,
102,
103,
104,
19,
23,
105,
106,
17,
18
]
],
"0.6389": [
"Идти или не идти на Звездные Войны, вот в чем вопрос ",
[
107,
108,
23,
107,
11,
17,
18,
109,
24,
110,
111
]
],
"0.6476": [
"Новые Звездные войны лучше первого эпизода, но хуже всех остальных",
[
50,
17,
18,
112,
113,
114,
76,
115,
15,
116
]
]
}
Traceback (most recent call last):
File "run.py", line 90, in
X_train, y_train,
NameError: name 'X_train' is not defined


Как сформировать X_train, y_train? И как сформировать X для result = model.predict_proba(X) ?
  • Вопрос задан
  • 796 просмотров
Решения вопроса 1
@xdgadd
ML/Python/Cpp
>Стэмминг
Воспользуйтесь SnowballStemmer'ом из библиотеки nltk и выделите корень для каждого слова из вашего датасета, добавляя результат в set.
>замена одинаковых слов числами по словарику
Создайте словарь, где каждому слову из множества соответствует свое число, что-то вроде:
words = {w: i for i, w in enumerate(set_of_stemmed_words)}

Далее вам нужно представить каждое предложение из датасета в виде списка токенов, в данном случае - с помощью словаря words. После этого вы готовы обучать свою модель, ура!

Впрочем, я хочу отметить, что такое представление слов (гуглите word embeddings) является не самой лучшей идеей, потому что сеть может сделать "ошибочные выводы" о важности или близости слов, руководствуясь величиной их токена. Гораздо эффективнее использовать вектора, полученные с помощью word2vec'а или TF-IDF etc.

UPD.
На коленке сделал для вас тетрадку. Подтяните для начала теорию в области машинного обучения в общем, а потом уже беритесь за нейросети. Начать можно вот с этой замечательной статьи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы