【问题标题】: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

如何解决?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    MultiLabelBinarizersplit 的列表理解一起使用:

    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,正是我的想法,答案在不到一分钟的时间内就准备好了......太棒了。
    猜你喜欢
    • 2019-07-06
    • 1970-01-01
    • 2017-09-22
    • 2018-12-09
    • 2014-09-23
    • 2020-01-30
    • 2016-07-04
    • 2016-12-21
    • 2020-06-14
    相关资源
    最近更新 更多