Python 我是否很好地理解单词嵌入(例如逻辑回归)的用法?

Python 我是否很好地理解单词嵌入(例如逻辑回归)的用法?,python,machine-learning,scikit-learn,nlp,deep-learning,Python,Machine Learning,Scikit Learn,Nlp,Deep Learning,我想知道我是否正确理解了在自然语言处理中使用world embedding的想法。我想告诉你们我是如何理解它的,并询问我的解释是否正确 假设我们想预测句子是肯定的还是否定的。我们将使用一个预先训练好的单词嵌入,它准备在一个非常大的文本语料库上,维度等于100。这意味着每个单词有100个值。我们的文件如下所示: ... new -0.68538535 -0.08992791 0.8066535 other 97 values ... man -0.6401568 -0.05007

我想知道我是否正确理解了在自然语言处理中使用world embedding的想法。我想告诉你们我是如何理解它的,并询问我的解释是否正确

假设我们想预测句子是肯定的还是否定的。我们将使用一个预先训练好的单词嵌入,它准备在一个非常大的文本语料库上,维度等于100。这意味着每个单词有100个值。我们的文件如下所示:

...
    new -0.68538535 -0.08992791 0.8066535 other 97 values ... 
    man -0.6401568 -0.05007627 0.65864474 ...
    many 0.18335487 -0.10728102 0.468635 ...
    doesnt 0.0694685 -0.4131108 0.0052553082 ...
...
1 This is positive and very amazing sentence.
0 I feel very sad.
x             y
1 [0.237968 0.17199863 -0.23182874...],[next 100 values],[next 100 values],[...],[...],0,0,0,0,0,
0 [...],[...],[...],[...],[...],[...],[...],0,0,0
1 [...],[...],[...],[...],[...],0,0,0,0,0
 ...
                   y
[100 values],[...],[...],[...],0,0,0,0,0,0
 ...
显然,我们有测试和训练设备。我们将使用sklearn模型来拟合和预测结果。我们的列车组看起来是这样的:

...
    new -0.68538535 -0.08992791 0.8066535 other 97 values ... 
    man -0.6401568 -0.05007627 0.65864474 ...
    many 0.18335487 -0.10728102 0.468635 ...
    doesnt 0.0694685 -0.4131108 0.0052553082 ...
...
1 This is positive and very amazing sentence.
0 I feel very sad.
x             y
1 [0.237968 0.17199863 -0.23182874...],[next 100 values],[next 100 values],[...],[...],0,0,0,0,0,
0 [...],[...],[...],[...],[...],[...],[...],0,0,0
1 [...],[...],[...],[...],[...],0,0,0,0,0
 ...
                   y
[100 values],[...],[...],[...],0,0,0,0,0,0
 ...
测试集包含如下句子:

In my opinion people are amazing.
我主要怀疑输入数据的预处理。我不知道是否应该这样做:

...
    new -0.68538535 -0.08992791 0.8066535 other 97 values ... 
    man -0.6401568 -0.05007627 0.65864474 ...
    many 0.18335487 -0.10728102 0.468635 ...
    doesnt 0.0694685 -0.4131108 0.0052553082 ...
...
1 This is positive and very amazing sentence.
0 I feel very sad.
x             y
1 [0.237968 0.17199863 -0.23182874...],[next 100 values],[next 100 values],[...],[...],0,0,0,0,0,
0 [...],[...],[...],[...],[...],[...],[...],0,0,0
1 [...],[...],[...],[...],[...],0,0,0,0,0
 ...
                   y
[100 values],[...],[...],[...],0,0,0,0,0,0
 ...
我们对所有句子都进行标记化、删除停止词、小写等。因此,对于我们的示例,我们得到:

'this', 'is', 'positive', 'very', 'amazing', 'sentence'
'i', 'feel', 'very', 'sad'

'in', 'my', 'opinion', 'people', 'amazing'
我们使用
pad\u序列

1,2,3,4,5,6
7,8,4,9

10,11,12,13,5
此外,我们还检查了列车集和测试集中最长句子的长度。假设在我们的例子中,最大长度等于10。我们需要所有长度相同的向量,以便用零填充剩余的字段

1,2,3,4,5,0,0,0,0,0
6,7,4,8,0,0,0,0,0,0

10,11,12,13,5,0,0,0,0,0
现在最大的疑问是——我们将单词嵌入word2vec文件中的值分配给训练集和测试集中准备好的向量中的所有单词

我们的word嵌入word2vec文件如下所示:

...
    in -0.039903056 0.46479827 0.2576446 ...
    ...
    opinion 0.237968 0.17199863 -0.23182874...
    ...
    people 0.2037858 -0.29881874 0.12108547 ...
    ...
    amazing 0.20736384 0.22415389 0.09953516 ...
    ...
    my 0.46468195 -0.35753986 0.6069699 ...
...
例如,
'in'、“我的”、“观点”、“人们”、“惊人”
等于
10,11,12,13,5,0,0,0,0
,我们得到如下表格:
[-0.039903056 0.46479827 0.2576446…],[0.46468195-0.35753986 0.6069699…],[0.237968 0.17199863-0.23182874…],[0.2037858-0.29881874 0.12108547…],[0.20736384 0.22415389 0.09953516…],[0,0,0,0,0

最后,我们的列车组看起来是这样的:

...
    new -0.68538535 -0.08992791 0.8066535 other 97 values ... 
    man -0.6401568 -0.05007627 0.65864474 ...
    many 0.18335487 -0.10728102 0.468635 ...
    doesnt 0.0694685 -0.4131108 0.0052553082 ...
...
1 This is positive and very amazing sentence.
0 I feel very sad.
x             y
1 [0.237968 0.17199863 -0.23182874...],[next 100 values],[next 100 values],[...],[...],0,0,0,0,0,
0 [...],[...],[...],[...],[...],[...],[...],0,0,0
1 [...],[...],[...],[...],[...],0,0,0,0,0
 ...
                   y
[100 values],[...],[...],[...],0,0,0,0,0,0
 ...
测试集的外观如下所示:

...
    new -0.68538535 -0.08992791 0.8066535 other 97 values ... 
    man -0.6401568 -0.05007627 0.65864474 ...
    many 0.18335487 -0.10728102 0.468635 ...
    doesnt 0.0694685 -0.4131108 0.0052553082 ...
...
1 This is positive and very amazing sentence.
0 I feel very sad.
x             y
1 [0.237968 0.17199863 -0.23182874...],[next 100 values],[next 100 values],[...],[...],0,0,0,0,0,
0 [...],[...],[...],[...],[...],[...],[...],0,0,0
1 [...],[...],[...],[...],[...],0,0,0,0,0
 ...
                   y
[100 values],[...],[...],[...],0,0,0,0,0,0
 ...
在最后一步中,我们使用例如sklearn模型来训练我们的模型:

 LogisticRegression().fit(values from y column of train set, values from x column of train set)
然后我们预测数据:

 LogisticRegression().predict(values from y column of test set)

在上面,我描述了整个过程,具体的步骤让我最怀疑。我要求你们指出我在推理和解释中所犯的错误。我想确保我理解正确。提前感谢您的帮助

逻辑回归接受X输入的平面2d矩阵,但您试图将一个奇怪的粗糙结构输入其中-它不起作用

我建议一个更简单的解决方案——只需将每个单词平均嵌入一个句子,作为逻辑回归的输入。在这种情况下,此输入将具有规则的形状,并且相对较小。如果您想改进此公式,可以对该平均值进行加权(例如,通过TF-IDF)


如果你想继续将sentenes建模为嵌入序列,你需要一个比逻辑回归更复杂的模型-例如,一个递归神经网络。

但我知道,例如,对于递归神经网络,卷积神经网络或长-短期记忆网络我所介绍的方法是正确的,这是解决这类问题最有效的方法之一?大概是的,但不是用标量零填充,而是用100维零向量填充,这样神经网络的每个输入都只是一个矩形矩阵。是的,递归NNs(LSTM只是其中的一种特殊类型)是解决此类问题的最佳方法之一。然而,平均嵌入的逻辑回归已经可以为您提供良好的分类质量(特别是如果您的训练数据不是那么大的话)。但是在平均逻辑回归的情况下,您的意思是,例如,对于示例中的句子,类似这样的
[(-0.039903056+0.46479827+0.2576446+…)/100,(0.46468195 + -0.35753986 +0.6069699 +...)/100,(0.237968 + 0.17199863 + -0.23182874+ ...)/100,(0.2037858 + -0.29881874 + 0.12108547 + ...)/100,(0.20736384 + 0.22415389 + 0.09953516 + ...)/100,[(0+0+0+...)/100,(0+0+0+...)/100,(0+0+0+...)/100,(0+0+0+...)/100,(0+0+0+...)/100]
?列车组中的一条线看起来像这样的
1032321062123,-02132,0.20736384,0.22415389,0.09953516,0,0,0,0,0,0
?不,我的意思是相反的:第一个输入是一个100维向量,坐标像
[(-0.039+0.237+0.207+…+0+0)/10,(0.464-0.357+0.171+…+0)/10,]
。您可能希望对其进行规范化(例如,使其L2范数等于1)。您首先将功能(不同的唯一单词)按列排列(可能按字母顺序排列),如一袋单词,然后为每个示例填充相应的列。这样,您最终将不会得到所有填充的0,但有些0将根据其在该列中不存在的功能中的位置而存在。