我的问题主要是理论上的。我想使用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)
答案 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是可用于情感分析的良好基线模型。