如何获得一个句子的热编码? [复制]
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,正是我的想法,答案在不到一分钟的时间内就准备好了......太棒了。以上是关于如何获得一个句子的热编码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用正则表达式仅捕获具有特定格式的有效句子的第一个单词? [复制]
如何从句子中删除多余的空格、制表符和换行符,并仅用一个空格替换它们? [复制]