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


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

文章插图
 
现在我们可以有一个关于标签类型分布的宏视图 。让我们以ORG标签(公司和组织)为例:
 
NLP中的文本分析和特征工程

文章插图
 
为了更深入地进行分析,我们需要解压缩在前面代码中创建的列“tags” 。让我们为一个标题类别绘制出最常见的标签:
y = "ENTERTAINMENT"  tags_list = dtf[dtf["y"]==y]["tags"].sum() map_lst = list(map(lambda x: list(x.keys())[0], tags_list)) dtf_tags = pd.DataFrame(map_lst, columns=['tag','type']) dtf_tags["count"] = 1 dtf_tags = dtf_tags.groupby(['type',                   'tag']).count().reset_index().sort_values("count",                   ascending=False) fig, ax = plt.subplots() fig.suptitle("Top frequent tags", fontsize=12) sns.barplot(x="count", y="tag", hue="type",              data=https://www.isolves.com/it/ai/2020-06-19/dtf_tags.iloc[:top,:], dodge=False, ax=ax) ax.grid(axis="x") plt.show()
NLP中的文本分析和特征工程

文章插图
 
接下来是NER的另一个有用的应用:你还记得我们把“Will Smith”的停止词去掉吗?这个问题的一个有趣的解决方案是将“Will Smith”替换为“Will_Smith”,这样它就不会受到删除停止词的影响 。因为遍历数据集中的所有文本以更改名称是不可能的,所以让我们使用SpaCy来实现这一点 。我们知道,SpaCy可以识别一个人的名字,因此我们可以使用它进行名字检测,然后修改字符串 。
## predict wit NERtxt = dtf["text"].iloc[0] entities = ner(txt).ents## tag text tagged_txt = txt for tag in entities:     tagged_txt = re.sub(tag.text, "_".join(tag.text.split()),                          tagged_txt) ## show result print(tagged_txt)
NLP中的文本分析和特征工程

文章插图
 
词频到目前为止,我们已经了解了如何通过分析和处理整个文本来进行特征工程 。现在我们来看看单个单词的重要性,通过计算n个字母的频率 。n-gram是来自给定文本样本的n项连续序列 。当n元数据的大小为1时,称为单元数据(大小为2时称为双元数据) 。
例如,短语“I like this article”可以分解为:
4个字母:“I”,“like”,“this”,“article”
3双字母:“I like”、“like this”、“this article”
本文以政治新闻为样本,介绍如何计算单、双信息频数 。
y = "POLITICS"corpus = dtf[dtf["y"]==y]["text_clean"]lst_tokens = nltk.tokenize.word_tokenize(corpus.str.cat(sep=" ")) fig, ax = plt.subplots(nrows=1, ncols=2) fig.suptitle("Most frequent words", fontsize=15)      ## unigrams dic_words_freq = nltk.FreqDist(lst_tokens) dtf_uni = pd.DataFrame(dic_words_freq.most_common(),                         columns=["Word","Freq"]) dtf_uni.set_index("Word").iloc[:top,:].sort_values(by="Freq").plot(                   kind="barh", title="Unigrams", ax=ax[0],                    legend=False).grid(axis='x') ax[0].set(ylabel=None)      ## bigrams dic_words_freq = nltk.FreqDist(nltk.ngrams(lst_tokens, 2)) dtf_bi = pd.DataFrame(dic_words_freq.most_common(),                        columns=["Word","Freq"]) dtf_bi["Word"] = dtf_bi["Word"].apply(lambda x: " ".join(                    string for string in x) ) dtf_bi.set_index("Word").iloc[:top,:].sort_values(by="Freq").plot(                   kind="barh", title="Bigrams", ax=ax[1],                   legend=False).grid(axis='x') ax[1].set(ylabel=None) plt.show()


推荐阅读