FastText模型简解+THUCNews新闻快速分类实战

本文介绍了FastText模型的架构、特点,包括字符级n-gram和分层Softmax,并对比了与Word2Vec的区别。通过THUCNews数据集,详细展示了从数据预处理到模型训练、评估的全过程,证实了FastText在文本分类任务上的高效性。
摘要由CSDN通过智能技术生成

模型架构:

和word2vec中的CBOW很相似, 即模型架构类似但是模型的任务不同。 使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。

  • 与word2vec的CBOW类似。不同之处是fastText预测标签,而CBOW预测的是中间词
  • 输入层:词和子词(subword)的n-gram的特征向量
  • 隐藏层:所有词的向量叠加求平均之后经过线性变换到隐藏层
  • 输出层:Hierarchical Softmax输出文本类别

在这里插入图片描述

  • CBOW输入时目标单词的上下文;fastText的输入是多个单词及其n-gram特征(这些特征表示当个文档)。
  • CBOW输入单词被onehot编码过;fastText输入特征被embedding过。
  • CBOW输出是目标词汇;fastText输出是文档对应的类标。

两个特色:

  • 输入时:字符级的n-gram:除了每个单词的词向量word embedding外,还为每个单词的n-gram字符添加一个向量,作为额外的特征。属于字粒度的n-gram,词粒度的n-gram。

    两点好处:

    1. 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。

    2. 对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。

      对于单词“apple”,假设n的取值为3,则它的trigram有

      “<ap”, “app”, “ppl”, “ple”, “le>”

      其中,<表示前缀,>表示后缀。于是,我们可以用这些trigram来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。

  • **输出时:分层softmax:**利用哈夫曼树构建,根据目标类别的多少自上而下构建,数目越多的类越在顶部。(与word2vec里类似)

核心思想:

将整篇文档的所有词及n-gram的词向量,叠加平均得到文档向量,然后使用文档向量做softmax线性多分类。

也就是说模型的输入数据==embedding词向量+自设定的n-gram向量的组合!!

这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类

为什么fasttext会快?

  • hierarchical softmax 和negative sampling是对普通softmax的极大提速。
  • hs里使用huffman树,做分类一般类别没那么多,叶子节点相对word2vec(每个目标词一个叶子节点)少很多。并且语料每一行只训练一次,word2vec要每个中心词训练一次,训练次数又少了很多。当然fasttext可以设置epoch训练多轮。
  • 各种提速的trick,比如提前算好exp的取值之类的,这点和word2vec是一样的了。

与Word2Vec比较:

  • 都可以无监督学习词向量, fastText训练词向量时会考虑subword
  • fastText还可以进行有监督学习进行文本分类
  • 都利用了hierarchical softmax进行加速
  • Fasttext引入字符级n-gram可以处理长词,未出现过的词,以及低频词

实战:

1-数据预处理

采用THUCNews中体育、娱乐、家居、房产,教育、时尚、时政、游戏、科技、财经10类新闻数据;dir_list =['sports','ent','house','home','edu','fashion','affairs','game','science','economic']

THUCNews中新闻数据如下:标题+新闻文本

体育	金寅�领先LPGA泰国开幕战 曾雅妮首轮落后3杆新浪体育讯 北京时间2月17日消息,美国LPGA新赛季首战泰国本田赛在Siam球场结束首轮比赛。22岁的韩国选手金寅?打出63杆,以3杆优势单独领先。本周新升至世界第一的中国台北小将曾雅妮,以66杆,与名人堂成员朱莉-英科斯特并列第2位。中国内地小将冯珊珊交出72杆,暂时并列第26位。本场比赛总奖金145万美元,60位选手参加,72洞比赛,不设晋级线。“很高兴可以在LPGA的第一场比赛,就打出了好成绩。今天开球很早,也很幸运,天气要更凉爽一些。”金寅?表示道,世界排名第7位的她总共抓到了九只小鸟:其中在5杆洞第1洞就率先开门红,而到了第18洞她险些切进小鸟,差点创造赛事的最低杆数新记录。金寅?坦言第1洞的小鸟给了自己很大的信心,而最终,63杆的成绩也是金寅?职业生涯的最佳单轮成绩记录,此前她在2010年三圣母(Tres Marias)锦标赛中打出过64杆,而该球场的标准杆是73杆。“今天是比赛的第一天,我没有给自己太多压力。现在算是个好的开始,但接下来我也不会去想太多。明天用同样的节奏去打球。”金寅?表示道,她称呼泰国天气很热,所以希望自己首先要吃好、睡好。现在与曾雅妮并列第二位的名人堂老将朱莉-英科斯特,对这周在泰国的生活很习惯,她喜欢泰式按摩,也喜欢吃泰式炒面,对当地热情的球迷也颇有好感。而这位在LPGA上赢过31场的老将,本轮交出66杆,其中在第7号洞,她用沙坑杆切进了98码的老鹰,展现了她不输年轻人的风采。自2006年的萨费维国际赛以来,英科斯特还一直无缘冠军,她最期待的就是在享受比赛的同时可以拿下这场胜利。想赢得这场胜利,并不容易。世界第一曾雅妮,正渴望2011年的四战四胜呢!之前,曾雅妮出战三场,全部都获得胜利,其中一场是在亚洲女子巡回赛,两场属于女子欧巡赛。今天她推杆出色,其中包括第17洞的一个25英尺的小鸟长推。“今年的赛场比去年要长,我的铁杆表现得不是很好,但我打得很有耐心。希望后面三天的比赛,自己表现更好一点。”曾雅妮说。卫冕冠军宫里蓝有个不太圆满的开局,75杆;而2007年的赛事冠军苏珊-佩特森是68杆,暂时排在了第5位。(小钻)

fasttext模型的训练数据格式要求为:文本内容(空格隔开)+“\t__label__类别\n",对新闻文本处理(分词)成如下格式:

金寅 领先 泰国 开幕 战曾 雅妮 首轮 落后 新浪 体育讯 北京 时间 美国 赛季 首战 泰国 田赛 球场 结束 首轮 比赛 韩国 选手 金寅 打出 以杆 优势 单独 领先 本周 升至 世界 第一 中国台北 小将 曾雅妮 以杆 名人堂 成员 朱莉英 科斯特 并列 第位 中国 内地 小将 冯珊珊 交出 暂时 并列 第位 本场 比赛 奖金 万美元 选手 参加 比赛 不设 晋级 第一场 比赛 打出 成绩 开球 很早 幸运 天气 凉爽 金寅 世界 排名第 总共 抓到 九只 小鸟 第洞 率先 开门红 第洞 险些 切进 小鸟 差点 创造 赛事 最低 杆数 记录 金寅 坦言 第洞 小鸟 很大 信心 最终 成绩 金寅 职业生涯 最佳 单轮 成绩 记录 此前 圣母 锦标赛 打出 过杆 球场 标准杆 比赛 第一天 压力 算是 好的开始 明天 节奏 打球 金寅 称呼 泰国 天气 希望 曾雅妮 并列 第二位 名人堂 老将 朱莉英 科斯特 这周 泰国 生活 习惯 喜欢 泰式 按摩 喜欢 泰式 炒面 热情 球迷 好感 这位 过场 老将 本轮 交出 第号 沙坑 切进 老鹰 展现 不输 年轻人 风采 自年 萨费维 国际 科斯特 无缘 冠军 期待 享受 比赛 拿下 这场 胜利 赢得 这场 胜利 世界 第一 曾雅妮 渴望 战四胜 曾雅妮 出战 三场 获得胜利 一场 亚洲 巡回赛 两场 欧巡赛 推杆 出色 包括 第洞 英尺 小鸟 赛场 去年 要长 铁杆 表现 耐心 希望 三天 比赛 表现 更好 一点 曾雅妮 卫冕冠军 宫里 蓝有 圆满 开局 赛事 冠军 苏珊 佩特森 暂时 排在 第位

训练集合:THUnews_10x500_jieba.txt,10个类别,每个类别500条新闻数据
测试集合:THUnews_10x50_jieba.txt,10个类别,每个类别50条新闻数据

通过下面预处理操作,生成最终满足fasttext模型要求的数据格式:

训练数据:news_fasttext_train10x500.txt
测试数据:news_fasttext_train10x50.txt

##生成fastext的训练和测试数据集
# 体育、娱乐、家居、房产,教育、时尚、时政、游戏、科技、财经10类
# 
dir_list = ['sports','ent','house','home','edu','fashion','affairs','game','science','economic']

# text文件不要在colabcolab中打开,colab是LinuxLinux系统,编码不一致
news_train="/content/drive/My Drive/Colab Notebooks/THUCNews/THUnews_10x500_jieba.txt"
train_news_ = open(news_train,encoding="utf-8")
train_lines=train_news_.readlines()
print(len(train_lines))
train_news_.close()

news_test="/content/drive/My Drive/Colab Notebooks/THUCNews/THUnews_10x50_jieba.txt"
test_news_ = open(news_test ,encoding="utf-8")
test_lines=test_news_.readlines()
print(len(test_lines)
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值