3 高级文本处理
到目前为止,我们已经做了所有的可以清洗我们数据的预处理基本步骤。现在,我们可以继续使用NLP技术提取特征。
3.1 N-grams
N-grams称为N元语言模型,是多个词语的组合,是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。常见模型有一元语言模型(unigrams)、二元语言模型(bigrams )、三元语言模型(trigrams )。
Unigrams包含的信息通常情况下比bigrams和trigrams少,需要根据具体应用选择语言模型,因为如果n-grams太短,这时不能捕获重要信息。另一方面,如果n-grams太长,那么捕获的信息基本上是一样的,没有差异性
TextBlob(train['tweet'][0]).ngrams(2)
[WordList(['father', 'dysfunctional']), WordList(['dysfunctional', 'selfish']), WordList(['selfish', 'drag']), WordList(['drag', 'kid']), WordList(['kid', 'dysfunction']), WordList(['dysfunction', 'run'])]
3.2 词频
词频(Term frequency)就是一个单词在一个句子出现的次数与这个句子单词个数的比例。
** TF = (Number of times term T appears in the particular row) / (number of terms in that row)**
tf1 = (train['tweet'][1:2]).apply(lambda x: pd.value_counts(x.split(" "))).sum(axis = 0).reset_index() tf1.columns = ['words','tf'] tf1
3.3 反转文档频率
反转文档频率(Inverse Document Frequency),简称为IDF,其原理可以简单理解为如果一个单词在所有文档都会出现,那么可能这个单词对我们没有那么重要。
一个单词的IDF就是所有行数与出现该单词的行的个数的比例,最后对数。
IDF = log(N/n)
import numpy as np for i,word in enumerate(tf1['words']): tf1.loc[i, 'idf'] =np.log(train.shape[0]/(len(train[train['tweet'].str.contains(word)]))) tf1
3.4 词频-反转文档频率(TF-IDF)
TF-IDF=TF*
IDF
tf1['tfidf']=tf1['tf']*tf1['idf'] tf1
我们可以看到,TF-IDF已经“惩罚了”‘don’t’, ‘can’t’, 和‘use’,因为它们是通用词,tf-idf的值都比较低。
另外可以通过sksklearn直接计算tf-idf值
from sklearn.feature_extraction.text import TfidfVectorizer tfidf = TfidfVectorizer(max_features=1000, lowercase=True, analyzer='word', stop_words= 'english',ngram_range=(1,1)) train_vect = tfidf.fit_transform(train['tweet']) train_vect
<31962x1000 sparse matrix of type '<class 'numpy.float64'>' with 114055 stored elements in Compressed Sparse Row format>
3.5 词袋
BOW,就是将文本/Query看作是一系列词的集合。由于词很多,所以咱们就用袋子把它们装起来,简称词袋。至于为什么用袋子而不用筐(basket)或者桶(bucket),这咱就不知道了。举个例子:
文本1:苏宁易购/是/国内/著名/的/B2C/电商/之一
这是一个短文本。“/”作为词与词之间的分割。从中我们可以看到这个文本包含“苏宁易购”,“B2C”,“电商”等词。换句话说,该文本的的词袋由“苏宁易购”,“电商”等词构成。
详细请参考词袋模型和词向量模型
from sklearn.feature_extraction.text import CountVectorizer bow = CountVectorizer(max_features=1000, lowercase=True, ngram_range=(1,1),analyzer = "word") train_bow = bow.fit_transform(train['tweet']) train_bow
<31962x1000 sparse matrix of type '<class 'numpy.int64'>' with 128402 stored elements in Compressed Sparse Row format>
3.6 情感分析
我们最终需要解决的任务就是如何对推文进行情感分析,在使用ML/DL模型之前,我们可以使用textblob库去进行评测情感
train['tweet'][:5].apply(lambda x:TextBlob(x).sentiment)
0 (-0.3, 0.5354166666666667) 1 (0.2, 0.2) 2 (0.0, 0.0) 3 (0.0, 0.0) 4 (0.0, 0.0) Name: tweet, dtype: object
使用TextBlob情感分析的结果,以元组的方式进行返回,形式如(polarity, subjectivity). 其中polarity的分数是一个范围为 [-1.0 , 1.0 ] 浮点数, 正数表示积极,负数表示消极。subjectivity 是一个 范围为 [0.0 , 1.0 ] 的浮点数,其中 0.0 表示 客观,1.0表示主观的。
下面是一个简单实例
from textblob import TextBlob testimonial = TextBlob("Textblob is amazingly simple to use. What great fun!") print(testimonial.sentiment)
Sentiment(polarity=0.39166666666666666, subjectivity=0.4357142857142857)
train['sentiment'] = train['tweet'].apply(lambda x: TextBlob(x).sentiment[0] ) train[['id','tweet','sentiment']].head()
4.7 词嵌入
词嵌入就是文本的向量化表示,潜在思想就是相似单词的向量之间的距离比较短。
from gensim.scripts.glove2word2vec import glove2word2vec glove_input_file = 'glove.6B.100d.txt' word2vec_output_file = 'glove.6B.100d.txt.word2vec' glove2word2vec(glove_input_file, word2vec_output_file)
总结
通过这篇文章,希望大家对文本数据处理步骤以及特征选择有了大致了解,推荐大家在这些基础之上,使用机器学习或者深度学习方法进行情感预测
文章来自于https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/