Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
Tensorflow 文本分类主要讲什么?
文本分类是一项为给定的文本片段分配合理的标签的任务。文本可以是一个短语、一个句子甚至一个段落。我们的目的是用一些文本作为输入,然后为输入打上标签。因为我们将用Tensorfow深度学习库,所以我们可以把这项文本分类任务叫作Tensorflow文本分类系统。看起来很简单不是吗~ 额,其实没那么简单。
分类任务涉及到训练一个包含有大量文本片段及其表达内容(标签)数据集的神经网络。我相信你们一定听过这个术语“情感分析”。我们将情感分析与文本分类任务相结合进行文本情感分析,这仅限于识别一个人说了什么。比如“这食物真实太棒啦!”这句话表达了积极的情感,相反,“这电影太差啦!”这句话表达了消极的情感;然而“太阳从东方升起”这句话蕴含的是中性情感
对于情感分析而言,标签一般包含积极、消极、中性三类。但是这只是文本分类的一项应用。如果你在构建其他像聊天机器人一样的的应用或者一个文档解析算法,你可能想要清楚每个特定的句子属于什么类别。比如:“您好”“您好吗?”可以被打上“打招呼”的类标签,“很高兴见到你”可以被打上“告别”类标签
你将要学什么?
你可以构建一个文本分类器来对一个给定的句子分类,打上为分类器训练的多个标签之一。在这个教程中,我们就要完成这个任务。我们将详细介绍你如何根据分类或标签构建一个自己的文本分类器。
Tensorflow文本分类这个文章将会被分为几节来展示。首先是文本数据预处理和生成并使用“词袋”技术,接下来讲述训练文本分类器,最后讲解测试和应用分类器。
如果你不知道Tensorflow是什么,你可以先读一下“Tensorflow是什么”这个文章
开始之前先看一下NLP领域的一些术语
自然语言处理在文本分类任务中被大量使用。所以,动手之前,我先讲一些我们会用到的相关术语和概念。这将会帮助你搞明白为什么调用一个特定的函数或进程,或者至少你能帮你弄清楚你可能会有的一些疑惑。
1.词干提取--词干提取是应用于提取单个词语词根的过程。一个句子中的很多词语经常被提取出来。为了标准化我们的过程,我们提取出这样的词语并且全部转换为词语的词根。比如,一个提取器将会把“walking”,"walked","walker"全部转换为“walk”
2.词语切分--Token基本上是单词。词语切分是一个将输入的文本片段进行处理,输入其中所有的单个词语。比如对于句子“Python NLP is just going great”来说,我们将得到一个token列表 [ “Python”, “NLP”, ?s”, “just”, “going”, “great”].你可以看到,词语切分就是把文本分解为词语。
3.词袋--在文本处理领域的词袋(BOW)模型是一个具有元素唯一性单词列表的过程。这个模型被用作特征生成。举例如下: 看如下两个句子:
1.Star Wars is better than Star Trek.
2.Star Trek isn’t as good as Star Wars.
对于这两个句子,BOW是[“Star”, “Wars”, “Trek”, “better”, “good”, “isn’t”, “is”, “as”]。 每个单词的位置因此也是固定的。那么,为了构建从一个句子进行分类的特征,我们使用二态数组(二态数组是指数组的每个元素只能是0或者1)
比如,一个新的句子“Wars is good”会被表示为[0,1,0,0,1,0,1,0]。如你所见,词袋数组中第二个位置处的值设置为1,因为在位置2处的单词是“wars”,同时“wars”也出现在样本句子中。同样,"is","good"也是一样的道理。你可以在下面这个链接读一读更多关于BOW模型的知识:https://ongspxm.github.io/blog/2014/12/bag-of-words-natural-language-processing/
注意:以下代码只用于展示大体过程,代码并不完整。想得到完整可用的代码,可以到我的Github仓库获取(链接在文末)
第一步: 准备数据
我们在训练一个能够将给定的文本进行分类的模型前,首先要做的是准备数据。我们可以创建一个包含有训练所需数据的简单JSON文件。
以下是我创建的一个包含五个类别的简单示例。你可以自己创建任意数量的类别。
上面我们创建了一个具有五个类别的简单JSON类(time,sorry,greeting,farewell 和age)。对于每一种类别,我们都有一些对应的句子用于训练模型。有了这些数据,我们必须将任何句子归于与以上五类中的一类。
第二步:数据加载和预处理
在这一步中,我们加载之前创建的JSON数据。假设我们的数据被存储在名称为data.json的文件中。
一旦我们加载数据之后,我们就要对数据进行一些操作来清理数据并形成词袋。
在上面的代码中,我们创建了多个列表。words列表包含有从所有用于训练的句子中提取出来的具有唯一性的词语。Categories列表包含所有的类别。
这一步的输出是docs列表。docs列表包含有每个句子中的单词以及这个句子所属的类。像这样([“whats”, “your”, “age”], “age”).
第三步:将数据转换为Tensorflow要求的格式。
在前面的步骤中,我们将数据转换成了文档,但是仍然是文本形式。Tensorflow作为一个数学库能够接受数值型数据。所以,我们开始用tensorflow进行文本分类前,需要对文本格式的语句数据应用BOW模型,将数据转换成二值数字型数组。我们用同样的方法来将标签/类别存入二值数字型数组。
4. 初始化Tensorflow文本分类器
文件转换成正确的格式后,我们现在可以开始用Tensorflow进行文本分类了。在这一步中,我们搭建一个简单的深度神经网络来训练我们的模型。
以上代码中训练次数为1000次。我训练了10000次,10000次包含了30000步,这花费了2分钟完成。
我有一块英伟达Geforce 940MX显卡。数据量大小以及显卡类型极大地决定了训练时间。以下是我进行的训练的一个截图。最终我几乎训练得到了100%的准确率。
第五步:测试Tensorflow文本分类模型
现在我们可以通过以下的代码来测试我们的神经网络文本分类器python模型了。
仅仅通过以上训练,我们的模型已经能够正确的对句子进行分类了。当然,模型还会对很多句子不能正确分类。因为用于训练的数据太少了。随着训练数据的增多,我们的模型可行度将越来越高。
总结及后续步骤
以上就是你如何通过Tensorflow进行文本分类。你可以应用这个方法并延伸它用于很多种不同的分类。你也可以用它来构建一个聊天机器人。
我希望这些能帮助你学习到新东西! 在下面留言告诉我你关于文章的想法,或者如果你有更好的实现方法,请分享你的想法!
你可以在以下GIT链接获得全部可运行的代码:
https://github.com/akshaypai/tfClassifier/tree/master/text_classification英文原文:https://sourcedexter.com/tensorflow-text-classification/
译者:YG