MultiLabelBinarizer
在机器学习自然语言处理的分类问题中,我们经常需要处理大量的中文字符,我们希望知道每一条数据中的某个数据项的出现中文字符的种类,并且进行标注从而进行下一步的处理。
这样描述比较抽象,举个例子,在处理党员干部的违规违纪通报时,对不同违纪的干部有不同的处分,如开除党籍,警告等,现在我们有100条党员干部的违纪通报,希望将每一个干部的处分转化为由0和1组成的序列。
from sklearn.preprocessing import MultiLabelBinarizer as MLB
point_df = pd.read_excel(config.test_path,header=None)#利用config类读取标记数据4274train.xlsx
point_df.dropna(inplace=True)#保存有效数据
point_df = point_df.rename(columns={0:"label",1:"content"})
print(point_df["label"] )
point_df['label'] = point_df['label'].apply(lambda x:x.split())
print(point_df["label"] )
mlb = MLB()#实例化类MultiLabelBinarizer(classes=None, sparse_output=False)
corpus_y = mlb.fit_transform(point_df["label"])
print(corpus_y)
第一次print(point_df['label'])
的结果为:
0 撤销党内职务
1 撤销党内职务
2 撤销党内职务
3 撤销党内职务
4 撤销党内职务
5 撤销党内职务
6 撤销党内职务
7 撤销党内职务
8 撤销党内职务
9 撤销党内职务
10 留党察看一年 政务降级
11 留党察看一年 政务降级
12 留党察看一年 政务降级 退缴相关款项
13 留党察看一年 政务降级 退缴相关款项
14 留党察看一年 退缴相关款项
15 留党察看一年 退缴相关款项
16 留党察看一年 政务处理
17 政务记大过
18 政务记大过
19 政务记大过
20 政务记大过
21 政务记大过 政务处理
22 政务记大过 退缴相关款项
23 政务记大过 组织处理
24 政务记过
25 政务记过
26 政务记过
第二次print(point_df[‘label’])的结果为:
0 [撤销党内职务]
1 [撤销党内职务]
2 [撤销党内职务]
3 [撤销党内职务]
4 [撤销党内职务]
5 [撤销党内职务]
6 [撤销党内职务]
7 [撤销党内职务]
8 [撤销党内职务]
9 [撤销党内职务]
10 [留党察看一年, 政务降级]
11 [留党察看一年, 政务降级]
12 [留党察看一年, 政务降级, 退缴相关款项]
13 [留党察看一年, 政务降级, 退缴相关款项]
14 [留党察看一年, 退缴相关款项]
15 [留党察看一年, 退缴相关款项]
16 [留党察看一年, 政务处理]
17 [政务记大过]
18 [政务记大过]
19 [政务记大过]
20 [政务记大过]
21 [政务记大过, 政务处理]
22 [政务记大过, 退缴相关款项]
23 [政务记大过, 组织处理]
24 [政务记过]
25 [政务记过]
26 [政务记过]
Name: label, dtype: object
最后print(corpus_y)
输出结果为:
[[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[0 0 0 0 1 1 0 0]
[0 0 0 0 1 1 0 0]
[0 0 0 0 1 1 0 1]
[0 0 0 0 1 1 0 1]
[0 0 0 0 0 1 0 1]
[0 0 0 0 0 1 0 1]
[0 1 0 0 0 1 0 0]
[0 0 1 0 0 0 0 0]
[0 0 1 0 0 0 0 0]
[0 0 1 0 0 0 0 0]
[0 0 1 0 0 0 0 0]
[0 1 1 0 0 0 0 0]
[0 0 1 0 0 0 0 1]
[0 0 1 0 0 0 1 0]
[0 0 0 1 0 0 0 0]
[0 0 0 1 0 0 0 0]
[0 0 0 1 0 0 0 0]]
可见sklearn.preprocessing.MultiLabelBinarizer
与pandas
的数据结果连用会得到很好的编码效果。
另外如果sklearn.preprocessing.MultiLabelBinarizer
的输入只是一整段字符串的话,结果会对每一个字进行分类。如:
text = '卷积神经网络 要求输入 数据长度 保持一致'
from sklearn.preprocessing import MultiLabelBinarizer as MLB
text = text.split()
print(text)#利用空格切出每个小标签(我的训练语料用空格分好的)
mlb = MLB()#实例化类MultiLabelBinarizer(classes=None, sparse_output=False)
corpus_y = mlb.fit_transform(text)#将标签转化成one-hot形式的序列
print (corpus_y)
输出为:
['卷积神经网络', '要求输入', '数据长度', '保持一致']
[[0 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0]
[0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0]
[0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1]
[1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0]]