百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

利用人工智能(Magpie开源库)给中文内容进行分类及打标签

toyiye 2024-07-08 00:38 11 浏览 0 评论

当下人工智能是真心的火热呀,各种原来传统的业务也都在尝试用人工智能技术来处理,以此来节省人工成本,提高生产效率。既然有这么火的利器,那么我们就先来简单认识下什么是人工智能吧,人工智能是指利用语音识别、语义理解、图像识别、视觉处理、机器学习、大数据分析等技术实现机器智能自动化做出响应的一种模拟人行为的手段。而我们这里介绍的Magpie则属于人工智能领域里语义理解、机器学习中的一个具体的实现技术。


前述

近期因为工作原因,需要从来自于客户聊天对话的文本中进行用户行为判断,并对其打上相应的标签。而我需要解决的就是利用文本内容进行机器自动分类打标签,但在业务中,一段文本会存有不同的多个标签,那么如何来实现呢?通过Github,找到了Magpie,发现其与我的需求非常吻合。一番折腾后,就有了本文章。


Magpie

Magpie是一个开源的文本分类库,基于一个高层神经网络Keras技术编写,后端默认由Tensorflow来处理。Magpie是由Python语言开发的,且默认只支持英文文本分类,我因为业务需要便在其基础上做了中文文本的支持。如下是Magpie相关的网址:

Magpie官网:https://github.com/inspirehep/magpie

Keras中文文档:https://keras-cn.readthedocs.io/en/latest/


实现

通过上面的介绍,我们清楚了需要实现的业务与目的,以及采用的技术手段。那么,就让我们一起来看看借助Magpie会有什么神秘的事情发生吧。

1、从Magpie下载源码包到本地,通过PyCharm IDE开发工具打开项目后发现有“data”、“magpie”、“save”等目录。其中“data”目录用于存放训练的源数据,“magpie”目录用于存放源代码,“save”目录用于存放训练后的模型文件,具体结如下图:


2、在项目中引用相应的第三方类库,如下:

   'nltk~=3.2',
   'numpy~=1.12',
   'scipy~=0.18',
   'gensim~=0.13',
   'scikit-learn~=0.18',
   'keras~=2.0',
   'h5py~=2.6',
   'jieba~=0.39',


3、对项目有了一定认识后,现在我们来准备源数据。我们这里假定有三种标签,分别为“军事“、”旅游“'、”政治”,每个标签各准备一定数量的源数据(训练数据理论上是越多越好,这里我偷懒就只按每个标签各准备了50条数据),其中拿出70%做为训练数据,30%做为测试数据,根据Magpie规则将训练源数据放到“data”目录内。


4、数据准备好后,我们需要改动源代码,使其能支持中文。中文面临一个问题就是分词,而我们这里使用jieba分词库。依次打开”magpie\base“目下的”Document“类中,并在该类内加入相应的分词代码,具体代码如下:

from __future__ import print_function, unicode_literals

import re
import io
import os
import nltk
import string
import jieba

from nltk.tokenize import WordPunctTokenizer, sent_tokenize, word_tokenize

nltk.download('punkt', quiet=True)  # make sure it's downloaded before using

class Document(object):

    """ Class representing a document that the keywords are extracted from """
    def __init__(self, doc_id, filepath, text=None):
        self.doc_id = doc_id

        if text:
            text = self.clean_text(text)
            text = self.seg_text(text)
            self.text = text
            self.filename = None
            self.filepath = None
        else:  # is a path to a file
            if not os.path.exists(filepath):
                raise ValueError("The file " + filepath + " doesn't exist")

            self.filepath = filepath
            self.filename = os.path.basename(filepath)
            with io.open(filepath, 'r', encoding='gbk') as f:
                text_context = f.read()
                text_context = self.clean_text(text_context)
                self.text = self.seg_text(text_context)
                print(self.text)
        self.wordset = self.compute_wordset()



    # 利用jieba包进行分词,并并且去掉停词,返回分词后的文本
    def seg_text(self,text):
        stop = [line.strip() for line in open('data/stopwords.txt', encoding='utf8').readlines()]
        text_seged = jieba.cut(text.strip())
        outstr = ''
        for word in text_seged:
            if word not in stop:
                outstr += word
                outstr += ""
        return outstr.strip()

    # 清洗文本,去除标点符号数字以及特殊符号
    def clean_text(self,content):
        text = re.sub(r'[+——!,;/·。?、~@#¥%……&*“”《》:()[]【】〔〕]+', '', content)
        text = re.sub(r'[▲!"#$%&\'()*+,-./:;<=>\\?@[\\]^_`{|}~]+', '', text)
        text = re.sub('\d+', '', text)
        text = re.sub('\s+', '', text)
        return text

    def __str__(self):
        return self.text

    def compute_wordset(self):
        tokens = WordPunctTokenizer().tokenize(self.text)
        lowercase = [t.lower() for t in tokens]
        return set(lowercase) - {',', '.', '!', ';', ':', '-', '', None}

    def get_all_words(self):
        """ Return all words tokenized, in lowercase and without punctuation """
        return [w.lower() for w in word_tokenize(self.text)
                if w not in string.punctuation]

    def read_sentences(self):
        lines = self.text.split('\n')
        raw = [sentence for inner_list in lines
               for sentence in sent_tokenize(inner_list)]
        return [[w.lower() for w in word_tokenize(s) if w not in string.punctuation]
                for s in raw]


5、通这上述的改造,我们的分类程序可以较好的支持中文了,接下来就可以进行数据训练了。项目是通过运行”train.py“类来进行训练操作,但在运行之前我们需要对该类做下改动,具体代码如下:

from magpie import Magpie

magpie = Magpie()
magpie.train_word2vec('data/hep-categories', vec_dim=3) #训练一个word2vec
magpie.fit_scaler('data/hep-categories') #生成scaler
magpie.init_word_vectors('data/hep-categories', vec_dim=3) #初始化词向量
labels = ['军事','旅游','政治'] #定义所有类别
magpie.train('data/hep-categories', labels, test_ratio=0.2, epochs=20) #训练,20%数据作为测试数据,5轮

#保存训练后的模型文件
magpie.save_word2vec_model('save/embeddings/here', overwrite=True)
magpie.save_scaler('save/scaler/here', overwrite=True)
magpie.save_model('save/model/here.h5')


6、运行”train.py“类来进行训练数据,截图如下:


7、模型训练成功后,接下来就可以进行模拟测试了。项目是通过运行”test.py“类来进行测试操作,但在运行之前我们需要对该类做下改动,具体代码如下:

from magpie import Magpie

magpie = Magpie(
    keras_model='save/model/here.h5',
    word2vec_model='save/embeddings/here',
    scaler='save/scaler/here',
    labels=['旅游', '军事', '政治']
)

#单条模拟测试数据
text = '特朗普在联合国大会发表演讲谈到这届美国政府成绩时,称他已经取得了美国历史上几乎最大的成就。随后大会现场传出了嘲笑声,特朗普立即回应道:“这是真的。”'
mag1 = magpie.predict_from_text(text)
print(mag1)

'''
#也可以通过从txt文件中读取测试数据进行批量测试
mag2 = magpie.predict_from_file('data/hep-categories/1002413.txt')
print(mag2)
'''


8、运行”test.py“类来进行测试数据,截图如下:


总结

1、文本分类在很多场景中都能应用,比如垃圾邮件分类、用户行为分析、文章分类等,通过本文简单的演示后聪明的你是不是有了一个更大的发现呢!

2、本文使用了Magpie开源库实现模型训练与测试,后台用Tensorflow来运算。并结合jieba分词进行中文切词处理。

3、Magpie本身是不支持中文文本内容的,在这里我加入了jieba分词库后使得整个分类程序有了较好的支持中文文本内容的能力。

4、本文测试分值跟训练数据的数量有一定关系,训练数据理论上是越多越好。

5、分享一句话:人工智能要有多少的智能,就必需要有多少的人工。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码