文章目录
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