fasttext实现文本分类

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: fasttext实现文本分类

fastText实现文本分类


目标


  1. 知道fastext是什么
  2. 能够应用fasttext进行文本分类
  3. 能够完成项目中意图识别的代码


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 数据准备


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

98c52d80e07b44059a14e56dbff7d1ee.png

66.png

以上格式是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())<1:
                continue
            elif keywords_in_line(line):
                continue
            elif line.startswith("M"):
                line = line[2:]
                line = re.sub("\s+"," ",line)
                line_cuted = " ".join(jieba_cut(line.strip())).strip()
                lable = "\t__label__{}\n".format("chat")
                f.write(line_cuted+lable)
                chat_num +=1
    print(chat_num)
def handle_QA_corpus():
    by_hand_data_path = "./corpus/recall/手动构造的问题.json" #手动构造的数据
    by_hand_data = json.load(open(by_hand_data_path))
    qa_num = 0
    f = open("./corpus/recall/text_classify.txt","a")
    for i in by_hand_data:
        for j in by_hand_data[i]:
            for x in j:
                x = re.sub("\s+", " ", x)
                line_cuted = " ".join(jieba_cut(x.strip())).strip()
                lable = "\t__label__{}\n".format("QA")
                f.write(line_cuted + lable)
                qa_num+=1
    #mogodb导出的数据
    for line in open("./corpus/recall/爬虫抓取的问题.csv"):
        line = re.sub("\s+", " ", line)
        line_cuted = " ".join(jieba_cut(line.strip()))
        lable = "\t__label__{}\n".format("QA")
        f.write(line_cuted + lable)
        qa_num += 1
    f.close()
    print(qa_num)


3.1.4 思考:


是否可以把文本分割为单个字作为特征呢?

修改上述代码,准备一份以单个字作为特征的符合要求的文本


3.2 模型的训练


import logging
import fastText
import pickle
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG)
ft_model = fastText.train_supervised("./data/text_classify.txt",wordNgrams=1,epoch=20)
ft_model.save_model("./data/ft_classify.model")


训练完成后看看测试的结果

ft_model = fastText.load_model("./data/ft_classify.model")
textlist = [
    # "人工智能 和 人工智障 有 啥 区别", #QA
    # "我 来 学 python 是不是 脑袋 有 问题 哦", #QA
    # "什么 是 python", #QA
    # "人工智能 和 python 有 什么 区别",  #QA
    # "为什么 要 学 python", #QA
    # "python 该 怎么 学",  #CHAT
    # "python", #QA
    "jave", #CHAT
    "php", #QA
    "理想 很 骨感 ,现实 很 丰满",
    "今天 天气 真好 啊",
    "你 怎么 可以 这样 呢",
    "哎呀 , 我 错 了",
]
ret = ft_model.predict(textlist)
print(ret)


3.2.2 模型的准确率该如何观察呢?


观察准备去,首先需要对文本进行划分,分为训练集和测试集,之后再使用测试集观察模型的准确率


3.3 模型的封装


为了在项目中更好的使用模型,需要对模型进行简单的封装,输入文本,返回结果

这里我们可以使用把单个字作为特征和把词语作为特征的手段结合起来实现

"""
构造模型进行预测
"""
import fastText
import config
from lib import cut
class Classify:
    def __init__(self):
        self.ft_word_model = fastText.load_model(config.fasttext_word_model_path)
        self.ft_model = fastText.load_model(config.fasttext_model_path)
    def is_qa(self,sentence_info):
        python_qs_list = [" ".join(sentence_info["cuted_sentence"])]
        result = self.ft_mode.predict(python_qs_list)
        python_qs_list = [" ".join(cut(sentence_info["sentence"],by_word=True))]
        words_result = self.ft_word_mode.predict(python_qs_list)
        acc,word_acc = self.get_qa_prob(result,words_result)
        if acc>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


 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

目录
相关文章
|
存储 算法 索引
LZW(Lempel-Ziv-Welch)
LZW(Lempel-Ziv-Welch)压缩算法是一种无损数据压缩算法,主要用于压缩文本文件和图像文件。它是由 Abraham Lempel、Jacob Ziv 和 Welch 共同发明的,基于哈夫曼编码和算术编码的思想,通过建立一个字典表对数据进行压缩。
701 2
|
11月前
|
机器学习/深度学习 数据采集 人工智能
实战FastText构建中文
FastText是由Tomas Mikolov团队于2016年推出的高效文本分类与词向量训练工具,作为Word2Vec的优化版本,其具备以下优势:训练速度快,比传统深度学习模型快多个数量级;支持大规模数据,可处理数十亿词汇;内置n-gram特征处理,简化文本预处理流程;资源消耗低,适合普通硬件运行。本文通过点评数据的二分类任务,展示了从数据下载、清洗、模型训练到评估的完整实践流程,验证了FastText在中文意图分类中的高效性与实用性。
924 0
|
10月前
|
人工智能 数据可视化 API
新手轻松上手:零基础搭建Qwen智能体指南
本文详细介绍了如何从零开始搭建Qwen-Agent智能体,涵盖环境配置、模型部署、工具调用及多Agent协作等关键步骤,帮助无AI经验的开发者快速上手,实现从环境准备到智能体运行的完整流程。
|
算法 机器人 Linux
Agent-Based概率模型让多无人机野外搜救更高效
【论文解读】Agent-Based概率模型、Receding Horizon规划策略、动态分区算法相结合,提升多无人机野外搜救效果
803 13
Agent-Based概率模型让多无人机野外搜救更高效
|
数据处理 Apache 流计算
实时计算引擎 Flink:从入门到深入理解
本篇详细介绍了Apache Flink实时计算引擎的基本概念和核心功能。从入门到深入,逐步介绍了Flink的数据源与接收、数据转换与计算、窗口操作以及状态管理等方面的内容,并附带代码示例进行实际操作演示。通过阅读本文,读者可以建立起对Flink实时计算引擎的全面理解,为实际项目中的实时数据处理提供了有力的指导和实践基础。
5731 2
MindIE对接vLLM框架开发指南
vLLM对接MindIE,使能快速迁移到昇腾设备上,当前MindIE 1.0.0发布版本已支持多种三方框架。
|
人工智能 自然语言处理 机器人
智能语音机器人底层系统设计逻辑机器人源码系统逻辑
简介: — 1 —智能客服背景智能语音客服机器人是在传统的客服系统基础上,集成了语音识别、语义理解、知识图谱、深度学习等多项智能交互技术,能准确理解用户的意图或提问,再根据丰富的内容和海量知识图谱,给予用户满意的回答。目前已广泛应用于金融、保险、汽车、房产、电商、政府等多个领域。
|
存储 自然语言处理
【NLP】gensim保存存储和加载fasttext词向量模型
【8月更文挑战第3天】如何使用Gensim库中的FastText模型来训练词向量,并演示了如何保存和加载这些训练好的模型。
358 2