NLP的文本分析与特征工程

本文介绍了如何使用自然语言处理(NLP)进行文本分析和特征工程,包括环境设置、语言检测、文本预处理、情感分析、命名实体识别、词频分析、词向量和主题模型等步骤。作者通过Python代码示例展示了如何处理新闻标题数据,以构建分类模型。
摘要由CSDN通过智能技术生成

作者|Mauro Di Pietro 编译|VK 来源|Towards Data Science

摘要

在本文中,我将使用NLP和Python解释如何为机器学习模型分析文本数据和提取特征。

自然语言处理(NLP)是人工智能的一个研究领域,它研究计算机与人类语言之间的相互作用,特别是如何对计算机进行编程以处理和分析大量自然语言数据。

NLP常用于文本数据的分类。文本分类是根据文本数据的内容对其进行分类的问题。文本分类最重要的部分是特征工程:从原始文本数据为机器学习模型创建特征的过程。

在本文中,我将解释不同的方法来分析文本并提取可用于构建分类模型的特征。我将介绍一些有用的Python代码。

这些代码可以很容易地应用于其他类似的情况(只需复制、粘贴、运行),并且我加上了注释,以便你可以理解示例(链接到下面的完整代码)。

https://github.com/mdipietro09/DataScience_ArtificialIntelligence_Utils/blob/master/deep_learning_natural_language_processing/text_classification_example.ipynb

我将使用“新闻类别数据集”(以下链接),其中向你提供从赫芬顿邮报获得的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)是将字符串拆分为字符串列表(或“标识”)的过程。

再以第

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值