数据分析学习总结笔记16:NLP自然语言处理与文本探索性分析

本文介绍了对新闻标题进行自然语言处理的探索性分析,包括文本统计、Ngram模型、情感分析、主题建模和词云图。使用Python库nltk、TextBlob、Vader Sentiment、spaCy等工具,对新闻标题进行词频分析、命名实体识别和可读性评估,揭示了战争、伊拉克等关键词在新闻中的重要性。
摘要由CSDN通过智能技术生成

1 引言

探索性数据分析是所有机器学习工作流程中最重要的部分之一,自然语言处理也不例外。但是应该选择哪些工具来进行有效地探索,及对文本数据进行可视化呢?

本文将讨论并实现几乎所有可用于理解文本数据的主要技术,并对完成这项工作的 Python 代码进行全面介绍。

2 数据集

本文将使用来自kaggle的包含100万个新闻标题的数据集。如果读者想一步一步地进行分析,可能需要安装以下python库:

pip install \ pandas matplotlib numpy \ nltk seaborn sklearn gensim pyldavis \ wordcloud textblob spacy textstat

现在,来看一下数据。

news= pd.read_csv('data/abcnews-date-text.csv',nrows=10000)
news.head(3)

数据集只包含两列,即发布日期和新闻标题。为了简单起见,本文将只对数据集中的前10000行进行探索分析,由于标题是按发布日期排序的,实际上是从2003年2月19日到2003年4月7日的两个月时间的新闻。
在这里插入图片描述

3 文本统计信息分析

文本统计可视化是一种简单但非常有见地的技术。包括:

  • 词频分析
  • 句子长度分析
  • 平均字长分析
  • 其他

这些有助于探索文本数据的基本特征。为此,我们将主要使用直方图(连续数据)和条形图(分类数据)。

首先,对每个句子中出现的字符数可视化。这可以让我们大致了解新闻标题的长度。

news['headline_text'].str.len().hist()

在这里插入图片描述
直方图显示新闻标题从10到70个字符不等,一般在25到55个字符之间。
现在,进行词级的数据探索,计算出每个新闻标题中出现的词数。

news['headline_text'].str.split().map(lambda x: len(x)).hist()

在这里插入图片描述
之后,进行每个句子中的平均词长度分析。

news['headline_text'].str.split().apply(lambda x : [len(i) for i in x]). map(lambda x: np.mean(x)).hist()

在这里插入图片描述
词的平均长度范围在3到9之间,5最常见。这是否意味着人们真正在新闻标题中使用了简短的词汇?

这种想法可能不正确的一个原因是“停用词”。在任何语言中,诸如英文中“ the”、“ a”、“ an”等,中文里的“的”、“在”等,最常用的词就是“停用词”。由于这些词的长度可能很小,也就可能导致了上面的图向左倾斜。

要获得包含停用词的语料库,可以使用nltk库。 nltk库包含多种语言的停用词。由于本文处理英语新闻,我们将从语料库中过滤英语中的停用词。

import nltk
nltk.download('stopwords')
stop = nltk.corpus.stopwords.words("english")

创建语料库。

corpus=[]
new= news['headline_text'].str.split()
new=new.values.tolist()
corpus=[word for i in new for word in i]
from collections import defaultdict
dic=defaultdict(int)
for word in corpus:
    if word in stop:
        dic[word]+=1
top=sorted(dic.items(), key=lambda x:x[1],reverse=True)[:10] 
x,y=zip(*top)
plt.bar(x,y)

然后写出最后的停用词。
在这里插入图片描述
可以清楚地看到,诸如“ to”、“ in”和“ for”之类的停用词在新闻标题中占据主导地位。现在知道在文本中哪些停用词经常出现,那么除了这些停用词以外的哪些词经常出现。

我们将使用collections库中的 counter 函数来计数并在元组列表中存储每个词的出现次数。在处理自然语言处理中的词级分析时,这是一个非常有用的函数。

counter=Counter(corpus)
most=counter.most_common()
x, y= [], []
for word,count in most[:40]:
    if (word not in stop):
        x.append(word)
        y.append(count)

sns.barplot(x=y,y=x)

在这里插入图片描述
“us”、“Iraq”和“war”占据了过去15年的新闻头条。这里的“ us”可能指美国或者我们(你和我)。us不是一个停顿词,但当观察图表中的其他词时,它们都与美伊战争有关,那么这里的“us”可能指的是美国。

4 Ngram模型探索

Ngrams是n个词的简单连续序列。例如“riverbank”、“The three musketeers”等等。如果词的数量是2,那么它就被称为二元组;有3个词叫做三元组。

关注最常见的n-grams可以更好地理解这个词的上下文。

为实现n-grams,本文将使用nltk.util中的ngrams函数:

from nltk.util import ngrams
list(ngrams(['I' ,'went','to','the','river','bank'],2))

在这里插入图片描述
知道如何创建 n-grams,就可以进行可视化。为词汇表构建代表,将使用 Countvectorizer

Countvectorizer是一种简单的方法,用于标记、向量化和以适当的形式表示语料库。可以在sklearn.feature_extraction.text中使用。

因此,我们将分析新闻标题中的二元组。

def get_top_ngram(corpus, n=None):
    vec = CountVectorizer(ngram_range=(n, n
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值