Форум программистов, компьютерный форум, киберфорум
Konst2016
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Рейтинг: 1.00. Голосов: 1.

Обучение рекурентной сети матрицей из gensim

Запись от Konst2016 размещена 31.07.2021 в 21:30

Здравствуйте!Хочу рассказать о более-менее серьезном проекте по моим попыткам обработки естественного языка(nlp).Здесь
для сетей (рекурентных) использовал pybrain, для представления слов статьи про искуственный интелект в виде 10-мерных
векторов(векторов Томаша Миколова word2vec)пакет gensim(о них в прошлых статьях).Я получил из статьи матрицу примерно
1_500 рядов и в ряду 10-мерное слово из статьи википедии про искусственный интелект и 2-мерный вектор (0, 1) говорящий
что это слово про искусственный интелект.Так я обрабатываю nlp.И эту матрицу я отдал рекурентной сети.Сеть должна
обучаться пока ошибка будет меньше 0.001.Она обучилась.Там есть функция evaluate() которая может оценить правильность
обучения сети на обучаещем наборе.Так вот она дала результат что правильных ответов только 0.05 %.
Сперва обрабатываю статью из интернета и сохраняю word2vec модель, скрипт 1.Потом обучаю-скрипт 2.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#1)
#-*- coding: utf8 -*-
import bs4 as bs
import urllib.request
import nltk
from nltk.corpus import stopwords
from gensim.models import Word2Vec
from gensim.test.utils import common_corpus, common_texts, get_tmpfile
import re
import os
 
scrapped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')
article = scrapped_data .read()
 
parsed_article = bs.BeautifulSoup(article,'lxml')
 
paragraphs = parsed_article.find_all('p')
 
article_text = ""
 
for p in paragraphs:
    article_text += p.text
 
# Cleaing the text
processed_article = article_text.lower()
processed_article = re.sub('[^a-zA-Z]', ' ', processed_article )
processed_article = re.sub(r'\s+', ' ', processed_article)
 
# Preparing the dataset
all_sentences = nltk.sent_tokenize(processed_article)
 
all_words = [nltk.word_tokenize(sent) for sent in all_sentences]
 
# Removing Stop Words
 
len_all_words=len(all_words)
for i in range(len_all_words):
    all_words[i] = [w for w in all_words[i] if w not in stopwords.words('english')]
 
word2vec = Word2Vec(all_words, min_count=0, vector_size=10)
word2vec.save(os.path.join(os.path.dirname(__file__),"my_w2v.model"))
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#2)
#-*- coding: utf-8 -*-
from pybrain.structure import RecurrentNetwork, FullConnection, LinearLayer, SigmoidLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from gensim.models import Word2Vec
import os
 
 
word2vec = Word2Vec.load(os.path.join(os.path.dirname(__file__),"my_w2v.model"))
 
len_all_words=len(word2vec.wv)
 
target=(0, 1)
matrix_arif=[]
 
 
for row_count in range(len_all_words):
    row_vector=(word2vec.wv.get_vector(list(word2vec.wv.key_to_index.keys())[row_count]), target) # создаем tuple
    matrix_arif.append(row_vector)
 
 
def evaluate(net , X_Y_test):
        scores = []
        res_acc = 0
        rows = len(X_Y_test)
        wi_y_test = len(X_Y_test[0])
        elem_of_out_nn = 0
        elem_answer = 0
        is_vecs_are_equal = False
        out_nn=None
        for row in range(rows):
            x_test = X_Y_test[row][0]
            y_test = X_Y_test[row][1]
 
            out_nn = net.activate(x_test)
            for elem in range(wi_y_test):
                elem_of_out_nn = out_nn[elem]
                elem_answer = y_test[elem]
                if elem_of_out_nn > 0.5:
                    elem_of_out_nn = 1
                    # print("output vector elem -> ( %f ) " % 1, end=' ')
                    # print("expected vector elem -> ( %f )" %
                          elem_answer, end=' ')
                else:
                    elem_of_out_nn = 0
                    # print("output vector elem -> ( %f ) " % 0, end=' ')
                    # print("expected vector elem -> ( %f )" %
                          elem_answer, end=' ')
                if elem_of_out_nn == elem_answer:
                    is_vecs_are_equal = True
                else:
                    is_vecs_are_equal = False
                    break
            if is_vecs_are_equal:
                # print("-Vecs are equal-")
                scores.append(1)
            else:
                # print("-Vecs are not equal-")
                scores.append(0)
 
        res_acc = sum(scores) / rows * 100
 
        return res_acc
 
 
 
#Define network structure
network = RecurrentNetwork(name="XOR")
 
inputLayer = LinearLayer(10, name="Input")
hiddenLayer = SigmoidLayer(15, name="Hidden")
outputLayer = LinearLayer(2, name="Output")
 
network.addInputModule(inputLayer)
network.addModule(hiddenLayer)
network.addOutputModule(outputLayer)
 
c1 = FullConnection(inputLayer, hiddenLayer, name="Input_to_Hidden")
c2 = FullConnection(hiddenLayer, outputLayer, name="Hidden_to_Output")
c3 = FullConnection(hiddenLayer, hiddenLayer, name="Recurrent_Connection")
 
network.addConnection(c1)
network.addRecurrentConnection(c3)
network.addConnection(c2)
 
network.sortModules()
 
#Add a data set
ds = SupervisedDataSet(10, 2)
 
 
height_X_Y=len(matrix_arif)
 
for input, target in matrix_arif:
    ds.addSample(input, target)
 
 
#Train the network
trainer = BackpropTrainer(network, ds, momentum=0.99)
 
max_error = 0.001 
error, count = 1, 1000
#Train
while abs(error) >= max_error:
    error = trainer.train()
    print('err {0:.5f}'.format(error))
    # count = count - 1
 
print("Error: ", error)
 
print(evaluate(network, matrix_arif))
Bash
1
2
<здесь вывод об ошибках>
0.05333333333333334
Размещено в Без категории
Показов 1413 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru