在自然语言处理中,词袋模型是一种常用的处理文本信息的模型。
我们拿到一段文本信号后,首先应该进行分词以得到一个个token,然后将这些token用向量表示出来再送入机器学习模型中进行训练。词袋模型和TF-IDF就是一种将token转变成向量的方法。
词袋模型:首先定义一些特殊的标记词,统计这些标记词在文本中出现的次数,将这些数字组成一个向量来代表文本。
如上图所示,有三个文本,分别是"good movie","not a good movie"和“did not like”,选择good,movie,not, a,did和like作为6个标记词,统计这6个词在文本中出现的次数,得到一个如右边表格所示的矩阵,每一行组成的向量代表一个文本。
这样得到了一个将文本转化成向量的模型,这样的模型有两个缺点:
在文本信息中,词的顺序会影响语义的判断,因此丢失了文本中词的顺序特征会造成识别的准确率下降。因此引入n-grams的概念。
在上面的模型中,选取的标记词都是一个单字,如果标记词中包含词组(比如包含两个、三个或者n个单字),那么这样的模型就可以在一定程度上弥补丢失的词的顺序这个缺点,这种方法我们成为n-grams。
如图,标记词中加入了两个单词组成的词组,这样重新得到一个矩阵,同样每一行代表一条文本信息。
缺点:当文本过大时会导致过多的特征。
解决方法:剔除一些用处不大的n-grams。
接下来问题就变成了如何处理出现频率中等的n-grams:
思路:同样依据出现频率来进行筛选。比如出现频率比较低的往往对于不同的文本有较好的区分度。于是引入TF-IDF指标。
TF(Term Frequency,词频):tf ( t, d )表示n-grams在文本d中出现的频次。
计算方法有多种:
IDF(Inverse document frequency,逆文本频率指数):
也就是说,如果n-grams在很多个文档中都出现,那么idf值计算出来就很小(最极端的情况,在所有文档中都出现,则idf值为0),这种情况下可以认为这个n-grams对不同文本的区分能力很差。
tfidf(t,d,D)=tf(t,d)·idf(t,D) ,为两个指标之积,那些在一个文本中出现频次高但是很少在其他文本中出现的词被认为对该文本具有很好的区分度,而这样的词就会有一个比较高的TF-IDF值。
总结:
最后是python 代码举例:
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
text = {"good movie", "not a good movie", "did not like",
"i like it", "good one"}
tfidf = TfidfVectorizer(min_df=2, max_df=0.5, ngram_range=(1, 2))
features = tfidf.fit_transform(texts)
pd.DataFrame(
features.todense(),
columns=tfidf.get_feature_names()
)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。