文本多任务分类

文本分类是一个很普遍问题,但是往往同一个数据源有多个category需要进行分类。面对这样问题,人本能会只看一次数据,同时对两个任务做分类,那么机器学习的方法是否也可以实现“看一样做多个任务分类”任务呢。答案当然是可以,本文只负责实现没有考虑多任务分类是否效果优于多个单任务分类。

导入工具包:

import h5py
import jieba as jb
import numpy as np
import keras as krs
import tensorflow as tf
from sklearn.preprocessing import LabelEncoder

加载数据:

def load_data():
    titles = []
    print("正在加载健康类别的数据...")
    with open("data/health.txt", "r") as f:
        for line in f.readlines():
            titles.append(line.strip())

    print("正在加载科技类别的数据...")
    with open("data/tech.txt", "r") as f:
        for line in f.readlines():
            titles.append(line.strip())


    print("正在加载设计类别的数据...")
    with open("data/design.txt", "r") as f:
        for line in f.readlines():
            titles.append(line.strip())

    print("一共加载了 %s 个标题" % len(titles))

    return titles
  
titles = load_data()

加载标签:

def load_label():
    arr0 = np.zeros(shape=[559, ])
    arr1 = np.ones(shape=[974, ])
    arr2 = np.array([2]).repeat(3646)
    target = np.hstack([arr0, arr1, arr2])
    print("一共加载了 %s 个标签" % target.shape)

    encoder = LabelEncoder()
    encoder.fit(target)
    encoded_target = encoder.transform(target)
    dummy_target = krs.utils.np_utils.to_categorical(encoded_target)

    return dummy_target
  
target = load_label()

数据预处理:

max_sequence_length = 30
embedding_size = 50

# 标题分词
titles = [".".join(jb.cut(t, cut_all=True)) for t in titles]

# word2vec 词袋化
vocab_processor = tf.contrib.learn.preprocessing.VocabularyProcessor(max_sequence_length, min_frequency=1)
text_processed = np.array(list(vocab_processor.fit_transform(titles)))

# 读取词标签
dict = vocab_processor.vocabulary_._mapping
sorted_vocab = sorted(dict.items(), key = lambda x : x[1])

两任务多分类网络构建:

def build_network(num_vocabs):
    inputs = krs.Input(shape=(max_sequence_length,))
    embbing = krs.layers.Embedding(num_vocabs, embedding_size)(inputs)
    lstms = krs.layers.LSTM(32,dropout=0.2, recurrent_dropout=0.2)(embbing)
    
    task1 = krs.layers.Dense(3,activation='sigmoid', name='task1_output')(lstms)
    task2 = krs.layers.Dense(3,activation='sigmoid', name='task2_output')(lstms)
    
    model_task1 = krs.models.Model(inputs=[inputs],outputs=[task1])
    model_task2 = krs.models.Model(inputs=[inputs],outputs=[task2])
    
    model_task1.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
    model_task2.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
    return model_task1,model_task2

模型生成:

num_vocabs = len(dict.items())
print(num_vocabs)
model1,model2 = build_network(num_vocabs=num_vocabs)

模型训练:

import time
start = time.time()
# 训练模型
model1.fit(text_processed, target, batch_size=512, epochs=10, )
model2.fit(text_processed, target, batch_size=512, epochs=10, )
finish = time.time()
print("训练耗时:%f 秒" %(finish-start))

测试例子:

sen = "做好商业设计需要学习的小技巧"
sen_prosessed = " ".join(jb.cut(sen, cut_all=True))
sen_prosessed = vocab_processor.transform([sen_prosessed])
sen_prosessed = np.array(list(sen_prosessed))
result1 = model1.predict(sen_prosessed)
result2 = model2.predict(sen_prosessed)
print(result1)
catalogue1 = list(result1[0]).index(max(result1[0]))
catalogue2 = list(result2[0]).index(max(result2[0]))
print(catalogue1)
threshold=0.8

if max(result1[0]) > threshold:
    if catalogue1 == 0:
        print("这是一篇关于健康的文章")
    elif catalogue1 == 1:
        print("这是一篇关于科技的文章")
    elif catalogue1 == 2:
        print("这是一篇关于设计的文章")
    else:
        print("这篇文章没有可信分类")
        
if max(result2[0]) > threshold:
    if catalogue2 == 0:
        print("这是一篇关于健康的文章")
    elif catalogue2 == 1:
        print("这是一篇关于科技的文章")
    elif catalogue2 == 2:
        print("这是一篇关于设计的文章")
    else:
        print("这篇文章没有可信分类")
print(result2)
print(catalogue2)

数据:

design.txt

新鲜出炉!2018年的用户体验设计趋势(下)
那些特别好用的App是如何设计的?首期揭秘:网易蜗牛读书
掌握这6个关键点,你也能制作出系统而专业的设计指南
Google对话式交互规范指南(六):用户对话中的自然惯例
新鲜出炉!2018年的用户体验设计趋势(上)
学会CTA 设计方法后,按钮的点击率高了49%!
超简单!帮你快速做出3D人物动画的网站
让APP中内容呈现更友好易用的5种常见导航设计模式
研习设K先生:版式设计奥义大揭秘!
产品设计中有哪些实用的行为经济学知识?
从这4个角度,做出情感化设计的产品
Google对话式交互规范指南(五):设计走查清单
如何让搜索框的体验更好?我总结了这些设计套路!
实战案例!揭秘网易严选营销线的设计过程
对色彩没感觉?三个方法提高你的色感训练
设计神器!轻松添加GIF文字特效的GIFntext
设计神器!提高工作效率的截图软件Snipaste
想成为交互设计师?来看前辈的入行心得!
Google对话式交互规范指南(四):对话UI设计流程与步骤
设计稿总监都通过了,前端哥哥却说实现不了…
为什么我们都应该学会组件化设计思维?

health.txt

冬天是老人的危险季节,这 4 种问题会要命
当你有一个身材好的男朋友,你会想尽一切办法不让他穿衣服
睡觉前5件小事竟是“健康杀手”,很多人竟然从没注意过
想备孕成功?医院教你如何安排同房时间
产妇三次要求却遭拒绝,刚出生的孩子突然死亡!法院这么判…...
能做4个引体向上就是全省第一?!这些“手无缚鸡之力”的学生到底怎么了?
不同的跑步小目标,有不同的跑法,你可能跑错了
红酒、陈醋不能软化血管!最靠谱的办法是这 4 招
50岁后要少动,休息才是最好的运动!北大最长寿教授都认同
神秘的「259」,一项被突然停止的资助研究
白糖蒸鸡蛋,这么有用,99%都不知道!!
“生下二胎,我们就离婚”
冬天是老人的危险季节,这 4 种问题会要命
当你有一个身材好的男朋友,你会想尽一切办法不让他穿衣服
睡觉前5件小事竟是“健康杀手”,很多人竟然从没注意过
想备孕成功?医院教你如何安排同房时间
产妇三次要求却遭拒绝,刚出生的孩子突然死亡!法院这么判…...
能做4个引体向上就是全省第一?!这些“手无缚鸡之力”的学生到底怎么了?
不同的跑步小目标,有不同的跑法,你可能跑错了
红酒、陈醋不能软化血管!最靠谱的办法是这 4 招
50岁后要少动,休息才是最好的运动!北大最长寿教授都认同
神秘的「259」,一项被突然停止的资助研究
白糖蒸鸡蛋,这么有用,99%都不知道!!
“生下二胎,我们就离婚”
工程院院士:饮用此物1分钟解渴、1个月健康、1辈子长寿!
长痘,肥胖、身体困重、口臭全是因为你体内的浊气 还有很多人不知道
晚上睡觉要不要关 WiFi?关于辐射的 5 个真相
神奇的经络操,快看

tech.txt

「IDG 哪些项目退出了?」「真格最爱与谁合投?」「xx 机构死亡项目列表」——IT 桔子都知道
马化腾自曝游戏爱好:王者荣耀玩得比较少 最近“吃鸡”很火!
2年全网粉丝500万,日涨粉过千,垂直视频号要这么玩才赚钱!
聊聊目前最薄的8代U笔记本
在深圳无人公交面前,我们都输了
交电费新选择!有了南方电网这款小程序,再也不用排队到天黑 | 国家队 #14
【早报】小米或寻求 IPO / 苹果将补缴 130 亿欧元税款 / Apple Pay 转账功能向美国用户开放
马化腾:基本不玩王者荣耀,「吃鸡」是重点;苹果向爱尔兰补缴 130 亿欧元税款| 极客早知道
除了瞎吃饭,互联网大会到底发生了啥?
倒计时两天!小程序带你围观全球最顶级财富盛宴
复旦教授徐英瑾:人工智能研究为何需要哲学参与? (上)
“捕兽人”周亚辉:用这三个方法抓住下一只 “独角兽”
「IDG 哪些项目退出了?」「真格最爱与谁合投?」「xx 机构死亡项目列表」——IT 桔子都知道
马化腾自曝游戏爱好:王者荣耀玩得比较少 最近“吃鸡”很火!
2年全网粉丝500万,日涨粉过千,垂直视频号要这么玩才赚钱!
聊聊目前最薄的8代U笔记本
在深圳无人公交面前,我们都输了
交电费新选择!有了南方电网这款小程序,再也不用排队到天黑 | 国家队 #14
【早报】小米或寻求 IPO / 苹果将补缴 130 亿欧元税款 / Apple Pay 转账功能向美国用户开放
马化腾:基本不玩王者荣耀,「吃鸡」是重点;苹果向爱尔兰补缴 130 亿欧元税款| 极客早知道
除了瞎吃饭,互联网大会到底发生了啥?
倒计时两天!小程序带你围观全球最顶级财富盛宴
复旦教授徐英瑾:人工智能研究为何需要哲学参与? (上)
“捕兽人”周亚辉:用这三个方法抓住下一只 “独角兽”
先别急着告别司机:刷爆朋友圈的深圳「阿尔法巴」究竟是什么?
库克:中国开发者在App Store赚走200亿
今夜,我们更愿意为你们喝彩
吃鸡大潮下的另一个致胜点——“吃鸡电竞赛事”,已经被《终结者2》捷足先登了
漫画爆文频频刷屏,灵魂画手为何能杀出自媒体红海?| 新榜观察
美国史上最大税改,听起来是好事,但为什么科技公司们笑不出来?
破局智慧零售,营销数据闭环是王道

 

你可能感兴趣的:(机器学习)