Python:LSTM模型和单词嵌入

时间:2020-01-02 19:55:40

标签: python keras lstm

我的问题主要是理论上的。我想使用LSTM模型以1 = positive, 0 = neutral and -1 = negative的方式对句子的情感进行分类。我想使用一袋单词(BOW)来训练模型。 BOW是具有以下两列的数据框:

Text            | Sentiment
hello dear...        1
I hate you...       -1
...                 ...

根据keras提出的示例,我应该将BOW的'Text'列的句子转换为数值向量,其中每个数字代表词汇中的一个单词。

现在我的问题是如何将我的句子变成数字向量,什么是最好的技术?

现在我的代码是这个,我在做什么错了?

model = Sequential()
model.add(LSTM(units=50)) 
model.add(Dense(2, activation='softmax')) # 2 because I have 3 classes
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

X_train, X_test, y_train, y_test = train_test_split(df['Text'], df['Sentiment'], test_size=0.3, random_state=1) #Sentiment maiuscolo per altro dataframe

clf = model.fit(X_train, y_train)
predicted = clf.predict(X_test)
print(predicted)

2 个答案:

答案 0 :(得分:1)

首先,正如Marat所评论的那样,您在此处未正确使用“词袋”(BOW)一词。您所谓的BOW仅仅是标记的句子数据集。尽管这里有很多问题,但我将尝试回答第一个有关如何将句子转换为可在LSTM模型中使用的向量的问题。

最基本的方法是为每个句子中的每个单词创建单编码矢量。要创建这些索引,您首先需要遍历数据集并为每个单词分配一个唯一的索引。例如:

vocab = 
{ 'hello': 0,
  'dear': 1,
   .
   .
   .
  'hate': 999}

一旦创建了该字典,就可以遍历每个句子,并为每个句子中的每个单词分配len(vocab)的向量,每个索引处的索引为零(与该单词对应的索引除外)。例如,使用上面的vocab,亲爱的看起来像: [0,1,0,0,0,...,0,0]

一键编码矢量的优点在于它们易于创建,并且使用起来非常简单。不利的一面是,如果您的词汇量很大,则可以很快使用超高维向量。这就是单词嵌入的作用,老实说,这是通向单编码矢量的最佳途径。但是,他们要复杂得多,也很难理解他们在幕后到底在做什么。如果您愿意,可以在这里了解更多信息:https://towardsdatascience.com/what-the-heck-is-word-embedding-b30f67f01c81

答案 1 :(得分:1)

您应该首先为您的词汇表创建索引,即为您的每个标记分配一个索引。然后通过将文本中的每个标记替换为其对应的索引,将其转换为数字形式。您的模型应为:

model = Sequential()
model.add(Embedding(len(vocab), 64, input_length=sent_len)
model.add(LSTM(units=50)) 
model.add(Dense(3, activation='softmax')) 

请注意,在将句子输入网络之前,需要将句子填充到相同的长度。您可以使用np.pad来这样做。

另一种替代方法是使用预先训练的词嵌入,您可以从fastText下载它们

P.S。您可能会错过使用BOW的机会,但是BOW是可用于情感分析的良好基线模型。

相关问题