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

当下人工智能是真心的火热呀,各种原来传统的业务也都在尝试用人工智能技术来处理,以此来节省人工成本,提高生产效率。既然有这么火的利器,那么我们就先来简单认识下什么是人工智能吧,人工智能是指利用语音识别、语义理解、图像识别、视觉处理、机器学习、大数据分析等技术实现机器智能自动化做出响应的一种模拟人行为的手段。而我们这里介绍的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、在项目中引用相应的第三方类库,如下:

  1 ‘nltk~=3.2‘,
  2 ‘numpy~=1.12‘,
  3 ‘scipy~=0.18‘,
  4 ‘gensim~=0.13‘,
  5 ‘scikit-learn~=0.18‘,
  6 ‘keras~=2.0‘,
  7 ‘h5py~=2.6‘,
  8 ‘jieba~=0.39‘,

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

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

  1 from __future__ import print_function, unicode_literals
  2
  3 import re
  4 import io
  5 import os
  6 import nltk
  7 import string
  8 import jieba
  9
 10 from nltk.tokenize import WordPunctTokenizer, sent_tokenize, word_tokenize
 11
 12 nltk.download(‘punkt‘, quiet=True)  # make sure it‘s downloaded before using
 13
 14 class Document(object):
 15
 16     """ Class representing a document that the keywords are extracted from """
 17     def __init__(self, doc_id, filepath, text=None):
 18         self.doc_id = doc_id
 19
 20         if text:
 21             text = self.clean_text(text)
 22             text = self.seg_text(text)
 23             self.text = text
 24             self.filename = None
 25             self.filepath = None
 26         else:  # is a path to a file
 27             if not os.path.exists(filepath):
 28                 raise ValueError("The file " + filepath + " doesn‘t exist")
 29
 30             self.filepath = filepath
 31             self.filename = os.path.basename(filepath)
 32             with io.open(filepath, ‘r‘, encoding=‘gbk‘) as f:
 33                 text_context = f.read()
 34                 text_context = self.clean_text(text_context)
 35                 self.text = self.seg_text(text_context)
 36                 print(self.text)
 37         self.wordset = self.compute_wordset()
 38
 39
 40
 41     # 利用jieba包进行分词,并并且去掉停词,返回分词后的文本
 42     def seg_text(self,text):
 43         stop = [line.strip() for line in open(‘data/stopwords.txt‘, encoding=‘utf8‘).readlines()]
 44         text_seged = jieba.cut(text.strip())
 45         outstr = ‘‘
 46         for word in text_seged:
 47             if word not in stop:
 48                 outstr += word
 49                 outstr += ""
 50         return outstr.strip()
 51
 52     # 清洗文本,去除标点符号数字以及特殊符号
 53     def clean_text(self,content):
 54         text = re.sub(r‘[+——!,;/·。?、[email protected]#¥%……&*“”《》:()[]【】〔〕]+‘, ‘‘, content)
 55         text = re.sub(r‘[▲!"#$%&\‘()*+,-./:;<=>\\[email protected][\\]^_`{|}~]+‘, ‘‘, text)
 56         text = re.sub(‘\d+‘, ‘‘, text)
 57         text = re.sub(‘\s+‘, ‘‘, text)
 58         return text
 59
 60     def __str__(self):
 61         return self.text
 62
 63     def compute_wordset(self):
 64         tokens = WordPunctTokenizer().tokenize(self.text)
 65         lowercase = [t.lower() for t in tokens]
 66         return set(lowercase) - {‘,‘, ‘.‘, ‘!‘, ‘;‘, ‘:‘, ‘-‘, ‘‘, None}
 67
 68     def get_all_words(self):
 69         """ Return all words tokenized, in lowercase and without punctuation """
 70         return [w.lower() for w in word_tokenize(self.text)
 71                 if w not in string.punctuation]
 72
 73     def read_sentences(self):
 74         lines = self.text.split(‘\n‘)
 75         raw = [sentence for inner_list in lines
 76                for sentence in sent_tokenize(inner_list)]
 77         return [[w.lower() for w in word_tokenize(s) if w not in string.punctuation]
 78                 for s in raw]
 79 

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

  1 from magpie import Magpie
  2
  3 magpie = Magpie()
  4 magpie.train_word2vec(‘data/hep-categories‘, vec_dim=3) #训练一个word2vec
  5 magpie.fit_scaler(‘data/hep-categories‘) #生成scaler
  6 magpie.init_word_vectors(‘data/hep-categories‘, vec_dim=3) #初始化词向量
  7 labels = [‘军事‘,‘旅游‘,‘政治‘] #定义所有类别
  8 magpie.train(‘data/hep-categories‘, labels, test_ratio=0.2, epochs=20) #训练,20%数据作为测试数据,5轮
  9
 10 #保存训练后的模型文件
 11 magpie.save_word2vec_model(‘save/embeddings/here‘, overwrite=True)
 12 magpie.save_scaler(‘save/scaler/here‘, overwrite=True)
 13 magpie.save_model(‘save/model/here.h5‘)

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

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

  1 from magpie import Magpie
  2
  3 magpie = Magpie(
  4     keras_model=‘save/model/here.h5‘,
  5     word2vec_model=‘save/embeddings/here‘,
  6     scaler=‘save/scaler/here‘,
  7     labels=[‘旅游‘, ‘军事‘, ‘政治‘]
  8 )
  9
 10 #单条模拟测试数据
 11 text = ‘特朗普在联合国大会发表演讲谈到这届美国政府成绩时,称他已经取得了美国历史上几乎最大的成就。随后大会现场传出了嘲笑声,特朗普立即回应道:“这是真的。”‘
 12 mag1 = magpie.predict_from_text(text)
 13 print(mag1)
 14
 15 ‘‘‘
 16 #也可以通过从txt文件中读取测试数据进行批量测试
 17 mag2 = magpie.predict_from_file(‘data/hep-categories/1002413.txt‘)
 18 print(mag2)
 19 ‘‘‘

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

总结

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

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

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

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

声明

本文为作者原创,转载请备注出处与保留原文地址,谢谢。如文章能给您带来帮助,请点下推荐或关注,感谢您的支持!

原文地址:https://www.cnblogs.com/Andre/p/9844170.html

时间: 2024-11-05 18:34:25

利用人工智能(Magpie开源库)给一段中文的文本内容进行分类打标签的相关文章

利用SQLite.Swift开源库操作数据库

因为在IOS项目中用到了sqlite数据库,在github上寻找支持的库,找到了这个库 https://github.com/stephencelis/SQLite.swift 按照说明文件提示,下载下来这个工程,并将它附加到自己的工程中 然后再自己的工程里导入这个模块 import SQLite 简单的说下语法,首先要初始化这个库,例如我用的是一个外置的库,按照路径打开 let db=Database(path,readonly:true) 并将其设置为只读 初始化表 let brand=db

DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

转:http://blog.csdn.net/zssureqh/article/details/8846337 背景介绍: 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档,写入数据库处理.由于医学图像的特殊性,每一个患者(即所谓的Patient)每做一次检查(即Study)都至少会产生一组图像序列(即Series),而每一组图像序列下会包含大量的dcm文件(例如做一次心脏CTA的诊断,完整的一个心脏断层扫描序列大约有200幅图像).DICOM3.0协议中对每一幅影像是按照特定的三个

【计算机视觉】OpenCV的最近邻开源库FLANN

FLANN介绍 FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库.不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制. flann::Index_类 该类模板是最近邻索引类,该类用于抽象不同类型的最近邻搜索的索引. 以下是flann::Index_类的声明: template <typename T> class #ifndef _MSC_VER FLANN_DEPRECATED #e

DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)

背景: 上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C++和C#环境下对DICOM图像的压缩.但是问题接踵而至啊,随着项目的深入,发现在单独的测试工程中可以实现的mDCM版本,在嵌入到项目整体中后,却意外地出现了错误,并未顺利实现DICOM图像的JPEG无损压缩.因此需要继续详细对比分析mDCM与DCMTK两者,期望寻找原因. 问题分析: 开启项目的日志功能后,得到的信息反馈为: No registered codec fo

DICOM:fo-dicom、dcm4che14、dcm4chee等开源库持续自我维护

题记: DICOM专栏系列虽然写了多年,但是依然不能解决大家日常中遇到的种种问题,其实这恰恰就是程序员(码农)工作的最大乐趣所在.就像每个人的人生一样,所处的环境不同,所遭遇的事件不同,结果自然就不同.程序开发亦是如此,操作系统不同.软件版本不同,本地配置不同都会导致种种问题. "授人以鱼不如授人以渔",所以正常的解决之道是希望通过专栏的讲解,能够让大家真正理解每个问题出现的背后原因,从而主动排查并解决问题.对于排查和解决过程中遇到的问题,我会整理总结成博文供大家参考.正如上文所说,每

GitHub上那些值得一试的JAVA开源库

作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,Spring,Hibernate等等.除了这些,你可能还会fork或Star一些其他的开源库,但GitHub上的库实在太多了,以至于对于个人来说,你很难有时间去发现并了解那些不断加入的新库,而它们却往往能在一些新兴领域中给你提供帮助. 我一直使用JAVA来写后端应用,平时也会关注一些国外技术大牛的博客(来自Tapki.DZone.Google Developer等技术博客),从而注意到

33 个 2017 年必须了解的 iOS/swift 开源库第三方库

本文翻译自Medium,原作者为 Pawe? Bia?ecki 照片版权:(Unsplash/Markus Pe) 你好,iOS 开发者们!我的名字叫 Pawe?,我是一个独立 iOS 开发者,并且是 Enter Universe 的作者. 接近两年前我发布了 27 个iOS开源库,让你的开发坐上火箭吧.这是我在这里最棒的文章了(根据 Medium 用户的反馈来看): 如果有 15.5 万人 很担心能否跨越网络上连山排海般的文字找到最棒的 iOS 开源库,那我来传递. 跟 33 个 pod 打个

各种有用的PHP开源库精心收集

转自:http://my.oschina.net/caroltc/blog/324024 摘要 各种有用的PHP开源库精心收集,包含图片处理,pdf生成,网络协议,网络请求,全文索引,高性能搜索,爬虫等等,项目肯定用得上的 PHP PHP开源库 目录[-] Swoole:重新定义PHP 1.html2ps and html2pdf    下载地址: http://www.tufat.com/script19.htm html2ps能够把带有图片,复杂表格(包含rowspan/colspan) ,

Android 网络开源库之-retrofit的解析详解

前言 当前的网络开源库有许多,如volley,okhttp,retrofit等,这三个库当前是比较火的,其中,okhttp和retrofit由square团队开发.关于这三个库的区别,请移步stackoverflow或者知乎查看.开发过程中选择什么样的开源库需要更具我们APP来做出选择.我们选出stackoverflow中的一段话来看下. 上面说,需要与web service通信的时候,我们使用retrofit.百度百科 web service介绍,那么我们见天就来了解下retrofit.