楼主: 时光永痕
884 0

[数据挖掘新闻] Python自然语言处理入门:以熟悉的术语构架文本分类 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

46%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
Python自然语言处理入门:以熟悉的术语构架文本分类
自然语言处理(NLP) 是一个广泛的领域,涵盖许多不同的任务,例如文本搜索,翻译,命名实体识别和主题建模。每天,只要我们搜索互联网,请语音助手告诉我们天气预报或翻译用其他语言编写的网页,我们都会使用NLP。企业使用NLP来了解客户如何在社交媒体上谈论其产品。NLP甚至可以帮助您获得更好的医疗保健,因为医疗保健行业将其应用于电子健康记录以更好地了解患者。
NLP中的一个核心问题是如何最好地表示文本数据,以便计算机可以使用它。在本文中,我将介绍文本分类,以演示一些常见且成功的表示文本数据的方法。尽管文本分类具有一些独特的特征-与主题建模等其他NLP领域不同,它需要标记数据-它与该领域的其余部分共享许多文本处理步骤。这篇文章的对象是熟悉建模但对使用文本不熟悉的分析师和数据科学家,所有代码示例都是用Python编写的。
如果您想遵循代码,可以在此处下载数据集  。解压缩后,您会发现一个制表符分隔的文件,名为“ imdb_labelled.txt”,其中包含一组IMDB电影评论及其相关情绪(1表示肯定,0表示否定)。我们的任务是使用电影评论的文本预测电影评论的正面还是负面。您可以在最后一节“将它们放在一起”中找到用于构建文本分类器的完整代码 。
整理您的文字:字词集
我们通常将文本数据称为“非结构化”数据,是因为与电子表格中的数据不同,文本数据不会自然地用可以用于机器学习算法的数字来表示。任何文本分类过程的第一步都是将文本数据转换为结构化形式,我们可以将其输入我们选择的算法中。
词袋是将文本转换为对机器学习有用的结构化形式的最简单方法。此方法将每个文本文档转换为一行,该行计算每个单词在文本中出现的次数。此输出通常称为术语文档矩阵。这是应用于一些(假)电影评论的“词袋”的外观:
词袋搜索过程从查找所有文本文档中的词汇或所有唯一单词开始。每个唯一字都分配有一个列号[2]。在这里,“喜欢”是第一列,“电影”是第二列,“伟大”是第三列,依此类推。省略号表示还有更多未显示的字列,但遵循相同的模式。
在词汇表中的每个单词都有一列之后,我们就可以开始计算单词在每个文本文档中出现的次数。在第一个文本文档中,单词“ great”出现了3次,因此我们在“ great”列中输入了3。在第二个文档中,“ awful”出现一次,因此我们在“ awful”列中输入1。对于文本文档中未出现的单词,我们将其设置为0。
您可能已经注意到,在此转换过程中,我们丢失了有关单词顺序的信息。一旦我们转变为“我爱这部电影!数据行[1、1、3、0,...]很棒,很棒,很棒”,我们可以更长久地分辨出“电影”是在原始文本中“喜欢”之前还是之后。每当我们使用单词袋时,我们都会假设单词顺序无关紧要。这是一个错误的假设,因为我们知道这样的句子:
“她穿上鞋子离开了。”
与以下内容具有不同的含义:
“她穿上左鞋。”
…尽管他们使用几乎相同的词。但是,在实践中,我们经常可以放弃单词顺序,仍然可以产生非常有用的模型。例如,如果我们试图对电影评论的正面还是负面进行分类,那么单词顺序可能与某人在评论中写下“好”或“好”的次数无关紧要。
scikit-learn库包含一个很好的实用工具,称为CountVectorizer。我们可以使用Python中的几行代码将玩具IMDB数据集转换为术语文档矩阵:
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
filename = 'imdb_labelled.txt'
names = ['text'
df = pd.read_csv(filename
bow = CountVectorizer()
X = bow.fit_transform(df.text)
瞧!我们有一个术语文档矩阵存储在变量X中。
查找重要的单词:  tf - IDF
我们在文本分析中遇到的一个普遍问题是,某些单词比其他单词更频繁,对分类没有用。例如,“ the”,“ is”和“ a”等单词是常见的英语单词,传达的含义不多。这些单词因文本文档的领域而异。如果我们正在进行电影评论,则“电影”一词将很常见,但没有用。另一方面,如果我们使用电子邮件数据,则“电影”一词可能并不常见,将很有用。
解决这些过多表示的单词的最简单方法是将单词计数除以出现每个单词的文本文档的比例。例如,文档:
“我喜欢这部电影!很棒,很棒,很棒。”
…一次包含“喜爱”和“电影”一词。现在,让我们假设我们查看所有其他文档,发现在文本文档中有1%出现了“喜欢”,而在33%中出现了“电影”。我们现在可以将分数加权为
“喜欢” =它出现在文本中的次数/出现在文本中的比例= 1/1%
“电影” =出现在文本中的次数/它出现在文本中的比例= 1/33%
在应用权重之前,“喜欢”和“电影”的得分均为1(因为每个词在句子中出现一次)。应用权重后,“喜欢”的得分为100,“电影”的得分为3。相对于“电影”,“喜欢”的得分要高得多,这表明我们更关心“喜欢”一词而不是“电影”。
实际上,我们对“喜爱”的评分现在是对“电影”评分的33倍。尽管我们怀疑“电影”在预测评论是正面还是负面方面应该不如“喜爱”重要,但这种相对差异可能太大。在我们当前的加权方案中,非常少见的单词(也许是拼写错误的单词)将获得太多的相对权重。
我们需要权衡减少频繁出现的单词与不增加罕见单词之间的平衡。这就是频率-逆文档频率(tf-idf)加权对我们的作用。在简单的加权方案中,我们使用以下公式:
单词在文本中出现的次数*(1 /出现在文本中的比例)
tf-idf加权通过取第二项的对数来稍微改变此公式:
单词在文本中出现的时间* log(1 / /出现在文本中的比例)
通过获取日志,我们确保相对于单词在我们所有文档中出现的频率而言,权重变化缓慢。这意味着,虽然普通单词的权重降低了,但它们的权重并没有降低太多。(与信息理论也有联系)。
让我们将tf-idf加权应用于我们之前构建的词袋矩阵。词袋矩阵中的值测量术语频率y,它是上式的左项。在计算文档总数以及每个单词出现多少文档之后,我们可以创建权重矩阵。这是我们的逆文档频率,这是公式的正确术语。将这两个矩阵逐元素相乘,然后创建最终的tf-idf加权术语文档矩阵。  
在应用tf-idf加权之后,相对于“电影”,我们现在赋予“喜爱”,“伟大”和“可怕”更高的重要性,因为“电影”在所有文本文档中都很常见。这些权重将帮助我们的模型,因为它们会使模型偏向于关注我们所关心的内容,而忽略次要的单词。
由于词袋后面通常会加上tf-idf权重,因此scikit-learn包含了一个结合了两个步骤的实用程序: TfidfVectorizer。 我们可以将上面代码中的CountVectorizer替换为TfidfVectorizer,然后获得tf-idf加权术语文档矩阵。
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(df.text)
在高维空间中工作
如上所述,当使用单词袋或tf-idf加权时,术语文档矩阵的词汇表中的每个单词都有一个列。拥有成千上万个单词的词汇并不罕见。这意味着我们的术语文档矩阵通常会有成千上万列或更多列。如此广泛的矩阵会带来一些问题:
宽矩阵使用大量的计算机内存。
具有如此多的列会使得难以训练在新的,看不见的数据上表现良好的模型。
我们可以通过明智地将矩阵存储在内存中来部分解决第一个问题。代替存储所有值的标准矩阵,我们使用  稀疏矩阵,在稀疏矩阵中,仅存储非零值,其他所有值均假定为零。这对于术语文档矩阵非常有效,因为每个文本文档仅使用词汇表中所有单词的一小部分。换句话说,术语文档矩阵中的每一行将大部分为零,并且稀疏矩阵将比标准矩阵使用更少的内存。
为标准矩阵编写的代码通常无法处理未经修改的稀疏矩阵。幸运的是,许多scikit-learn的算法都支持稀疏矩阵,从而使文本数据更易于在Python中使用。实际上,CountVectorizer和TfidfVectorizer默认情况下将返回稀疏矩阵,许多分类器和回归器将本机处理稀疏矩阵输入。
为了解决高维数据的第二个问题(即模型的通用性),我们有一些选择。首先,我们可以使用scikit-learn的LogisticRegression等算法直接对宽矩阵建模。该模型使用一种称为正则化的技术来选择与分类相关的列,并过滤掉不相关的列。实际上,这通常效果很好,并且易于使用和实现。但是,它没有利用单词之间的相似性。
在开始建模之前,可以通过压缩术语文档矩阵来做得更好。我们首先直接减少数据的维数,然后在范围更窄的数据集上建立模型,而不是直接对宽范围的数据集进行建模。这种压缩非常类似于群集,其中为文本文档分配了每个群集的分数,以衡量文本与群集的关联程度。
这个想法的直觉是我们希望某些词(例如“享受”,“快乐”和“喜悦”)具有相似的含义。与其将每个单词单独包括一列,我们将它们压缩成一列,以衡量更广泛的享乐观念。
这种压缩的好处是可以帮助我们的模型同时学习诸如“享受”,“快乐”和“愉悦”之类的相关单词。例如,我们可能有很多训练示例,其中包括“享受”一词,但只有少数例子包括“愉悦”。如果没有压缩,该模型将无法从“喜悦”中学习太多,因为需要学习的行很少。但是,如果我们可以将“享受”与“愉悦”一起挤压,那么我们的模型所学到的关于“享受”的所有内容也可以应用于“愉悦”。
有许多方法可以减少术语文档矩阵的维数。一种非常常见的方法是将奇异值分解(SVD)应用于tf-idf加权术语文档矩阵。此过程通常称为潜在语义分析(LSA)。比较两个文本的相似性时,经常使用LSA。用LSA转换两个文本后,它们之间的余弦距离可以很好地衡量它们之间的相关性。
在文本分类(和回归)中,我们还可以将tf-idf加权矩阵直接输入到神经网络中以进行降维。在这种方法中,我们可以将第一个隐藏层视为压缩步骤,将第二个隐藏层视为分类模型。相对于LSA,这种方法的好处是压缩考虑了我们试图预测的标签。换句话说,压缩可以忽略任何不利于预测标签的内容。
放在一起
让我们将上面讨论的方法与模型结合起来,看看完整的文本分类工作流程是什么样子。对于模型,我将使用muffnn的多层感知器(MLP),这是Civis开源的软件包。该软件包将Tensorflow神经网络库包装在scikit-learn接口中,因此我们可以将整个文本分类过程链接为一条scikit-learn管道。Scikit-learn也具有MLP模型,尽管它不包括像Dropout这样的最新神经网络技术。
我们将使用tf-idf加权术语文档矩阵作为输入,并使用标签作为评论是正面还是负面(0或1)的指标来构建模型。我们将执行5倍交叉验证,并对样本外准确性进行平均,以衡量我们的模型在看不见的新数据上的表现如何。
from muffnn import MLPClassifier
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
# Read Data. Source:
# http://archive.ics.uci.edu/ml/ma ... bases/00331/sent...
filename = 'imdb_labelled.txt'
names = ['text'
df = pd.read_csv(filename
# Chain together tf-idf and an MLP with a single hidden layer of size 256
tfidf = TfidfVectorizer()
mlp = MLPClassifier(hidden_units=(256
classifier = make_pipeline(tfidf
# Get cross-validated accuracy of the model
cv_accuracy = cross_val_score(classifier
print("Mean Accuracy: {}".format(np.mean(cv_accuracy)))
大!该模型在5个交叉验证折叠中实现了约78%的可观准确性。从这里我们可以开始建立一个更强大的建模框架,包括通过网格搜索调整模型参数,并遵循最佳实践,例如保留一些数据作为模型的最终验证。调整模型后,尽管由于人们认为正面和负面的观点不一致,我们可能永远无法达到100%的准确度。
我们可以使用文本分类器做很多事情,从分析客户评论到过滤垃圾邮件到检测欺诈。但是,由于文本数据不是以现成的电子表格格式提供的,因此通常可以不使用它。这篇博客文章展示了几种将文本变形为可插入我们喜欢的模型的形式的方法。使用scikit-learn和Tensorflow之类的工具,比以往任何时候都更容易上手。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 自然语言 语言处理 scikit-learn classifier

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 02:52