您当前的位置: 首页 >  分类

IT之一小佬

暂无认证

  • 0浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

fastText实现文本分类

IT之一小佬 发布时间:2021-04-06 19:48:19 ,浏览量:0

fastText实现文本分类 1. fastText的介绍  【用来获取词向量,进行文本分类的工具;分类的效率,得到词向量的效率高】

文档地址:https://fasttext.cc/docs/en/support.html

fastText is a library for efficient learning of word representations and sentence classification.

fastText是一个单词表示学习和文本分类的库

优点:在标准的多核CPU上, 在10分钟之内能够训练10亿词级别语料库的词向量,能够在1分钟之内给30万多类别的50多万句子进行分类。

fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。

 

2. 安装和基本使用 2.1 安装步骤:
  1. 下载 git clone https://github.com/facebookresearch/fastText.git

  2. cd cd fastText

  3. 安装 python setup.py install

2.2 基本使用

  1. 把数据准备为需要的格式

  2. 进行模型的训练、保存和加载、预测

#1. 训练
model = fastText.train_supervised("./data/text_classify.txt",wordNgrams=1,epoch=20)
#2. 保存
model.save_model("./data/ft_classify.model")
#3. 加载
model = fastText.load_model("./data/ft_classify.model")

textlist = [句子1,句子2]
#4. 预测,传入句子列表
ret = model.predict(textlist)
3. 意图识别实现 3.1 数据准备

数据准备最终需要的形式如下:

以上格式是fastText要求的格式,其中chat、QA字段可以自定义,就是目标值,__label__之前的为特征值,需要使用\t进行分隔,特征值需要进行分词,__label__后面的是目标值

 

3.1.1 准备特征文本

使用之前通过模板构造的样本和通过爬虫抓取的百度上的相似问题,

3.1.2 准备闲聊文本

使用小黄鸡的语料,地址:https://github.com/fateleak/dgk_lost_conv/tree/master/results

3.1.3 把文本转化为需要的格式

对两部分文本进行分词、合并,转化为需要的格式

def prepar_data():
    #小黄鸡 作为闲聊
    xiaohaungji = "./corpus/recall/小黄鸡未分词.conv"
    handle_chat_corpus(xiaohaungji)
    # mongodb中的数据,问题和相似问题作为 问答
    handle_mongodb_corpus()

def keywords_in_line(line):
    """相似问题中去除关键字不在其中的句子
    """
    keywords_list = ["传智播客","传智","黑马程序员","黑马","python"
    "人工智能","c语言","c++","java","javaee","前端","移动开发","ui",
    "ue","大数据","软件测试","php","h5","产品经理","linux","运维","go语言",
    "区块链","影视制作","pmp","项目管理","新媒体","小程序","前端"]
    for keyword in keywords_list:
        if keyword in line:
            return True
    return False


def handle_chat_corpus(path):
    chat_num = 0
    with open("./corpus/recall/text_classify.txt","a") as f:
        for line in open(path,"r"):
            if line.strip() == "E" or len(line.strip())0.95 or word_acc>0.95:
            #是QA
            return True
        else:
            return False

    def get_qa_prob(self,result,words_result):
        label, acc, word_label, word_acc = zip(*result, *words_result)
        label = label[0]
        acc = acc[0]
        word_label = word_label[0]
        word_acc = word_acc[0]
        if label == "__label__chat":
            acc = 1 - acc
        if word_label == "__label__chat":
            word_acc = 1 - word_acc
        return acc,word_acc

 

关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.0482s