NLP中的文本分析和特征工程( 六 )


NLP中的文本分析和特征工程

文章插图
 
如果有n个字母只出现在一个类别中,这些都可能成为新的特色 。更费力的方法是对整个语料库进行向量化并使用所有单词作为特征(词包方法) 。
现在我将向您展示如何将单词频率作为一个特性添加到您的dataframe中 。我们只需要Scikit-learn中的CountVectorizer,这是Python中最流行的机器学习库之一 。矢量化器将文本文档集合转换为令牌计数矩阵 。我将用3个n-g来举个例子:“box office”(娱乐圈经常用)、“republican”(政治圈经常用)、“apple”(科技圈经常用) 。
lst_words = ["box office", "republican", "apple"]## countlst_grams = [len(word.split(" ")) for word in lst_words] vectorizer = feature_extraction.text.CountVectorizer(                  vocabulary=lst_words,                   ngram_range=(min(lst_grams),max(lst_grams)))dtf_X = pd.DataFrame(vectorizer.fit_transform(dtf["text_clean"]).todense(), columns=lst_words)## add the new features as columns dtf = pd.concat([dtf, dtf_X.set_index(dtf.index)], axis=1) dtf.head()
NLP中的文本分析和特征工程

文章插图
 
可视化相同信息的一种好方法是使用单词云,其中每个标记的频率用字体大小和颜色显示 。
wc = wordcloud.WordCloud(background_color='black', max_words=100,                          max_font_size=35) wc = wc.generate(str(corpus)) fig = plt.figure(num=1) plt.axis('off') plt.imshow(wc, cmap=None) plt.show()
NLP中的文本分析和特征工程

文章插图
 
词向量最近,NLP领域开发了新的语言模型,它依赖于神经网络结构,而不是更传统的n-gram模型 。这些新技术是一套语言建模和特征学习技术,将单词转化为实数向量,因此称为单词嵌入 。
单词嵌入模型通过建立在所选单词前后出现标记的概率分布,将某个单词映射到一个向量 。这些模型迅速流行起来,因为一旦有了实数而不是字符串,就可以执行计算 。例如,要查找具有相同上下文的单词,只需计算向量距离 。
有几个Python库可以使用这种模型 。SpaCy就是其中之一,但由于我们已经使用过它,我将谈谈另一个著名的软件包:Gensim 。一个使用现代统计机器学习的无监督主题建模和自然语言处理的开源库 。使用Gensim,我将加载一个预先训练好的Global vector模型 。Global vector是一种无监督学习算法,用于获取大小为300的单词的向量表示 。
nlp = gensim_api.load("glove-wiki-gigaword-300")我们可以使用这个对象将单词映射到矢量:
word = "love"nlp[word]
NLP中的文本分析和特征工程

文章插图
 
nlp[word].shape 
NLP中的文本分析和特征工程

文章插图
 
现在让我们看看最接近的单词向量是什么,或者换句话说,是那些经常出现在相似上下文中的单词 。为了在二维空间中画出向量,我需要把维数从300减少到2 。我用的是scikit学习的t分布随机邻接嵌入 。t-SNE是一种可视化高维数据的工具,它将数据点之间的相似性转换为联合概率 。
## find closest vectorslabels, X, x, y = [], [], [], [] for t in nlp.most_similar(word, topn=20):     X.append(nlp[t[0]])     labels.append(t[0])## reduce dimensions pca = manifold.TSNE(perplexity=40, n_components=2, init='pca') new_values = pca.fit_transform(X) for value in new_values:     x.append(value[0])     y.append(value[1])## plot fig = plt.figure() for i in range(len(x)):     plt.scatter(x[i], y[i], c="black")     plt.annotate(labels[i], xy=(x[i],y[i]), xytext=(5,2),                 textcoords='offset points', ha='right', va='bottom')## add center plt.scatter(x=0, y=0, c="red") plt.annotate(word, xy=(0,0), xytext=(5,2), textcoords='offset               points', ha='right', va='bottom')
NLP中的文本分析和特征工程


推荐阅读