【问题标题】:Tokenizer error in Keras pipelineKeras 管道中的标记器错误
【发布时间】:2017-01-11 22:57:05
【问题描述】:

我想使用 keras 进行作者归属。我有一个(文本,标签)列表。我正在尝试使用 keras 内置矢量化器,但出现以下错误:

向量化序列数据... Traceback(最近一次调用最后一次):文件“”,第 1 行,在文件中 “/home/angelo/org/courses/corpusling/finalproject/src/neuralnet.py”, 第 46 行,在 X_train = tokenizer.texts_to_matrix(X_train, mode='binary') 文件 "/home/angelo/org/courses/corpusling/finalproject/venv0/lib/python3.5/site-packages/keras/preprocessing/text.py", 第 166 行,在 texts_to_matrix 序列= self.texts_to_sequences(文本)文件“/home/angelo/org/courses/corpusling/finalproject/venv0/lib/python3.5/site-packages/keras/preprocessing/text.py”, 第 131 行,在 texts_to_sequences 对于self.texts_to_sequences_generator(文本)中的vect:文件“/home/angelo/org/courses/corpusling/finalproject/venv0/lib/python3.5/site-packages/keras/preprocessing/text.py”, 第 150 行,在 texts_to_sequences_generator i = self.word_index.get(w) AttributeError: 'Tokenizer' 对象没有属性 'word_index'

以下是我目前的代码:

import glob
import os
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.preprocessing.text import Tokenizer
from keras.utils import np_utils


def get_label(filename):
    tmp = os.path.split(filename)[0]
    label = os.path.basename(tmp)
    return label


def read_file(filename):
    with open(filename) as f:
        text = f.read()
    return text


traindocs = "../data/C50/C50train/*/*.txt"
testdocs = "../data/C50/C50test/*/*.txt"

documents_train = (read_file(f) for f in glob.iglob(traindocs))
labels_train = (get_label(f) for f in glob.iglob(traindocs))

documents_test = (read_file(f) for f in glob.iglob(testdocs))
labels_test = (get_label(f) for f in glob.iglob(testdocs))

df_train = pd.DataFrame([documents_train, labels_train])
df_train = df_train.transpose()
df_train.rename(columns={0: 'text', 1: 'author'}, inplace=True)
df_test = pd.DataFrame([documents_test, labels_test])
df_test = df_test.transpose()
df_test.rename(columns={0: 'text', 1: 'author'}, inplace=True)

max_words = 1000
print('Vectorizing sequence data...')
tokenizer = Tokenizer(nb_words=max_words)

X_train, Y_train = df_train.text, df_train.author
X_test, Y_test = df_test.text, df_test.author

X_train = tokenizer.texts_to_matrix(X_train, mode='binary')
X_test = tokenizer.texts_to_matrix(X_test, mode='binary')

nb_classes = np.max(Y_train) + 1

print('Convert class vector to binary class matrix (for use with categorical_crossentropy)')
Y_train = np_utils.to_categorical(Y_train, nb_classes)
Y_test = np_utils.to_categorical(Y_test, nb_classes)

model = Sequential()

model.add(Dense(output_dim=512, input_dim=(max_words,)))
model.add(Activation("relu"))
model.add(Dense(output_dim=(np.max(Y_train)+1)))
model.add(Activation("softmax"))

model.compile(loss='categorical_crossentropy',
              optimizer='sgd', metrics=['accuracy'])

model.fit(X_train, Y_train, nb_epoch=5, batch_size=32)

loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)

【问题讨论】:

    标签: python keras


    【解决方案1】:

    在使用tokenizer.texts_to_matrix()之前需要使用tokenizer.fit_on_texts(texts)

    这里texts 是文本数据列表(训练和测试)。

    fit_on_texts() 使用它来构建word_index。它只不过是唯一的单词到数字的映射。而这个映射后来被用来生成矩阵。

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2022-11-09
      相关资源
      最近更新 更多