P
P
pcdesign2017-11-11 20:02:59
Python
pcdesign, 2017-11-11 20:02:59

How to run this neural network code?

There was an article on Habré:
https://habrahabr.ru/company/dca/blog/274027/
Quote from there:

Very interesting article, thanks! Is the rest of the code somewhere on github?

And thank you for your feedback. The rest of the code is nothing tricky - stemming and replacing the same words with numbers according to the dictionary, so I did not write it out. If interested, I can post

Almost a year has passed, and things are still there.
All this reminds me of a meme with drawing an owl: The
282444.jpg
question is how to run this code with all the texts so that the output is what the author of the article got?
And so that you can write a new comment and see what rating the neural network will give him.
update Nov 16
# -*- 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)

Result of work:
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

How to form X_train, y_train? And how to form X for result = model.predict_proba(X) ?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
X
xdgadd, 2017-11-11
@pcdesign

>Stamming
Use SnowballStemmer from the nltk library and extract the root for each word in your dataset, adding the result to set.
>replacing identical words with numbers according to the dictionary
Create a dictionary where each word from the set has its own number, something like:
Next, you need to represent each sentence in the dataset as a list of tokens, in this case using the words dictionary. After that, you are ready to train your model, hooray!
However, I want to point out that such representation of words (google word embeddings) is not the best idea, because the network can make "erroneous conclusions" about the importance or proximity of words, guided by the value of their token. It's much more efficient to use vectors generated by word2vec or TF-IDF etc.
UPD.
On my knee I made a notebook for you . To begin with, pull up the theory in the field of machine learning in general, and then take on neural networks. You can start with this wonderful article.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question