作者|Mauro Di Pietro 编译|VK 来源|Towards Data Science
摘要
在本文中,我将使用NLP和Python解释如何为机器学习模型分析文本数据和提取特征。
自然语言处理(NLP)是人工智能的一个研究领域,它研究计算机与人类语言之间的相互作用,特别是如何对计算机进行编程以处理和分析大量自然语言数据。
NLP常用于文本数据的分类。文本分类是根据文本数据的内容对其进行分类的问题。文本分类最重要的部分是特征工程:从原始文本数据为机器学习模型创建特征的过程。
在本文中,我将解释不同的方法来分析文本并提取可用于构建分类模型的特征。我将介绍一些有用的Python代码。
这些代码可以很容易地应用于其他类似的情况(只需复制、粘贴、运行),并且我加上了注释,以便你可以理解示例(链接到下面的完整代码)。
我将使用“新闻类别数据集”(以下链接),其中向你提供从赫芬顿邮报获得的2012年至2018年的新闻标题,并要求你使用正确的类别对其进行分类。
https://www.kaggle.com/rmisra/news-category-dataset
特别是,我将通过:
环境设置:导入包并读取数据。
语言检测:了解哪些自然语言数据在其中。
文本预处理:文本清理和转换。
长度分析:用不同的指标来衡量。
情绪分析:判断一篇文章是正面的还是负面的。
命名实体识别:带有预定义类别(如人名、组织、位置)的标识文本。
词频:找出最重要的n个字母。
词向量:把一个字转换成向量。
主题模型:从语料库中提取主题。
环境设置
首先,我需要导入以下库。
## 数据
import pandas as pd
import collections
import json
## 绘图
import matplotlib.pyplot as plt
import seaborn as sns
import wordcloud
## 文本处理
import re
import nltk
## 语言检测
import langdetect
## 情感分析
from textblob import TextBlob
## 命名实体识别
import spacy
## 词频
from sklearn import feature_extraction, manifold
## word embedding
import gensim.downloader as gensim_api
## 主题模型
import gensim
数据集包含在一个json文件中,因此我将首先使用json包将其读入字典列表,然后将其转换为pandas数据帧。
lst_dics = []
with open('data.json', mode='r', errors='ignore') as json_file:
for dic in json_file:
lst_dics.append( json.loads(dic) )
## 打印第一个
lst_dics[0]
原始数据集包含30多个类别,但在本教程中,我将使用3个类别的子集:娱乐、政治和技术(Entertainment, Politics, Tech)。
## 创建dtf
dtf = pd.DataFrame(lst_dics)
## 筛选类别
dtf = dtf[ dtf["category"].isin(['ENTERTAINMENT','POLITICS','TECH']) ][["category","headline"]]
## 重命名列
dtf = dtf.rename(columns={"category":"y", "headline":"text"})
## 打印5个随机行
dtf.sample(5)
为了理解数据集的组成,我将通过用条形图显示标签频率来研究单变量分布(仅一个变量的概率分布)。
x = "y"
fig, ax = plt.subplots()
fig.suptitle(x, fontsize=12)
dtf[x].reset_index().groupby(x).count().sort_values(by=
"index").plot(kind="barh", legend=False,
ax=ax).grid(axis='x')
plt.show()
数据集是不平衡的:与其他数据集相比,科技新闻的比例确实很小。这可能是建模过程中的一个问题,对数据集重新采样可能很有用。
现在已经设置好了,我将从清理数据开始,然后从原始文本中提取不同的细节,并将它们作为数据帧的新列添加。这些新信息可以作为分类模型的潜在特征。
语言检测
首先,我想确保我使用的是同一种语言,并且使用langdetect包,这非常简单。为了举例说明,我将在数据集的第一个新闻标题上使用它:
txt = dtf["text"].iloc[0]
print(txt, " --> ", langdetect.detect(txt))
我们为整个数据集添加一个包含语言信息的列:
dtf['lang'] = dtf["text"].apply(lambda x: langdetect.detect(x) if
x.strip() != "" else "")
dtf.head()
数据帧现在有一个新列。使用之前的相同代码,我可以看到有多少种不同的语言:
即使有不同的语言,英语也是主要的语言。所以我要用英语过滤新闻。
dtf = dtf[dtf["lang"]=="en"]
文本预处理
数据预处理是准备原始数据以使其适合机器学习模型的阶段。对于NLP,这包括文本清理、删除停用词、词干还原。
文本清理步骤因数据类型和所需任务而异。通常,在文本被标识化之前,字符串被转换为小写,标点符号被删除。标识化(Tokenization)是将字符串拆分为字符串列表(或“标识”)的过程。
再以第