如何获得一个句子的热编码? [复制]

Posted

技术标签:

【中文标题】如何获得一个句子的热编码? [复制]【英文标题】:how to get one hot encoding for a sentence? [duplicate] 【发布时间】:2019-05-01 08:44:53 【问题描述】:

我有一个包含一个句子的列表,我想对每个单词中的一个完整句子执行一次热编码,

例如,

sentences = [
  "python, java",
  "linux, windows, ubuntu",
  "java, linux, ubuntu, windows",
  "performance, python, mac"
]

我想要这样的输出,

   java  linux  mac  performance  python  ubuntu  windows
0     1      0    0            0       1       0        0
1     0      1    0            0       0       1        1
2     1      1    0            0       0       1        1
3     0      0    1            1       1       0        0

我的尝试,

我试图将我的句子转换成系列然后执行get_dummies,但我得到的是每个单词而不是句子。

print pd.get_dummies(pd.Series(sum([tag.split(', ') for tag in sentences],[])))

O/P

    java  linux  mac  performance  python  ubuntu  windows
0      0      0    0            0       1       0        0
1      1      0    0            0       0       0        0
2      0      1    0            0       0       0        0
3      0      0    0            0       0       0        1
4      0      0    0            0       0       1        0
5      1      0    0            0       0       0        0
6      0      1    0            0       0       0        0
7      0      0    0            0       0       1        0
8      0      0    0            0       0       0        1
9      0      0    0            1       0       0        0
10     0      0    0            0       1       0        0
11     0      0    1            0       0       0        0

如何解决?

【问题讨论】:

【参考方案1】:

将MultiLabelBinarizer 与split 的列表理解一起使用:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform([x.split(', ') for x in sentences]),columns=mlb.classes_)
print (df)
   java  linux  mac  performance  python  ubuntu  windows
0     1      0    0            0       1       0        0
1     0      1    0            0       0       1        1
2     1      1    0            0       0       1        1
3     0      0    1            1       1       0        0

Series.str.get_dummies 的另一个解决方案:

print (pd.Series(sentences).str.get_dummies(', '))
   java  linux  mac  performance  python  ubuntu  windows
0     1      0    0            0       1       0        0
1     0      1    0            0       0       1        1
2     1      1    0            0       0       1        1
3     0      0    1            1       1       0        0

性能不同:

sentences = sentences * 1000

In [166]: %%timeit
     ...: mlb = MultiLabelBinarizer()
     ...: df = pd.DataFrame(mlb.fit_transform([x.split(', ') for x in sentences]),columns=mlb.classes_)
     ...: 
8.06 ms ± 179 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [167]: %%timeit
     ...: pd.Series(sentences).str.get_dummies(', ')
     ...: 
105 ms ± 1.33 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

【讨论】:

你有多快!!!真的很神奇,创建这个问题我花了 5 分钟,但你在 1 分钟内回答了这个问题。难以置信!!!! @MohamedThasinah - 你很快,我在 10-20 分钟内创建问题。比回答更难...... @MohamedThasinah,正是我的想法,答案在不到一分钟的时间内就准备好了......太棒了。

以上是关于如何获得一个句子的热编码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从通用句子编码器输出为 LSTM 生成输入

如何使用正则表达式仅捕获具有特定格式的有效句子的第一个单词? [复制]

如何从句子中删除多余的空格、制表符和换行符,并仅用一个空格替换它们? [复制]

从书中复制C#代码(假人为C#.0,无法获得预期的结果

如何让 Python 循环遍历句子,但它给了我句子中的单词而不是句子中的每个字母? [复制]

BERT 获取句子嵌入