中文文本特征提取: 对文本数据进行特征值化(转换成特征向量),主要有两个API来实现 CountVectorizer 和 TfidfVectorizer
sklearn.feature_extraction.text
CountVectorizer:
- 只考虑词汇在文本中出现的频率
TfidfVectorizer:
- 除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量
- 能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征
相比之下,文本条目越多,Tfidf的效果会越显著
1 CountVectorizer
1.1 API
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])# 返回词频矩阵
CountVectorizer.fit_transform(X)# 文本或包含文本字符串的可迭代对象,返回:spare矩阵
CountVectorizer.inverse_transform(X)# X:array数组或者sparse矩阵,返回值:转换之前数据格式
CountVectorizer.get_feature_names()# 返回单词列表
1.2 适用于英文,而对于中文文本,语言之间没有分隔,人为的将中文句子断开显得不实用。
def count_demo():
"""
文本特征抽取:CountVectorizer
:return:
"""
data = ["Life is short,i like like python", "Life is too long,i dislike python"]
# 1、实例化一个转换器
# transfer = CountVectorizer(sparse = False)# 错误用法,CountVectorizer中就没有这个设置
# transfer = CountVectorizer(stop_words = ["is", "like"])# 停用词
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("特征名字:\n", transfer.get_feature_names())
# print("data_new:\n", data_new, type(data_new))
print("data_new:\n", data_new.toarray())
return None
def count_chinese_demo():
"""
中文文本特征抽取:CountVectorizer
:return:
"""
data = ["我 爱 北京 天安门", "天安门 上太阳升"]
# 1、实例化一个转换器
# transfer = CountVectorizer(sparse = False)# 错误用法,CountVectorizer中就没有这个设置
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("特征名字:\n", transfer.get_feature_names())
# print("data_new:\n", data_new, type(data_new))
print("data_new:\n", data_new.toarray())
return None
1.3 可以先对中文语句进行分词,再进行统计。
def cut_word(text):
"""
进行中文分词
:param text:
:return:
"""
a = " ".join(list(jieba.cut(text)))# list列表化,
# print(a)
return " ".join(list(jieba.cut(text)))
return text
def count_chinese_demo2():
"""
中文文本特征抽取2
:return:
"""
data = ["后天我即将要去往外地工作,不知道未来过的怎么样,祝福自己,祝福家人。",
"再见了科大计算机的每一位同学,我会想念你们"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 1、实例化一个转换器
transfer = CountVectorizer(stop_words=["一个", "所以"])
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
2 Tf-idf文本特征提取
- TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类区分能力,适合用来分类。
- TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
2.1 公式:
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率。
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到。
tfidf = tf * idf
例:
1000篇文章-语料库
100篇-“非常”
10篇-“经济”
两篇文章A&B
A(100词):10次“经济” Tf-idf:0.2(更重要)
tf:10/100 = 0.1
idf:lg 1000/10 = 2
B(100词):10次“非常” Tf-idf:0.1
tf:10/100 = 0.1
idf:lg 1000/100 = 1
2.2 API
sklearn.feature_extraction.text.TfidfVertorizer(stop_words = None,...)
TfidfVertorizer.fit_transform(X)# X:文本或者包含文本字符串的可迭代对象,返回:sparse矩阵
TfidfVertorizer.inverse_transform(X)# X:array数组或者sparse矩阵,返回:转换之前数据格式
TfidfVertorizer.get_feature_names()# 返回:单词列表
2.3 代码
def tfidf_demo():
"""
用TF-IDF方法进行文本特征抽取
:return:
"""
data = ["后天我即将要去往外地,不知道那里怎么样,祝福自己,祝福家人。",
"再见了科大计算机的每一位同学,我会想念你们"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 1、实例化一个转换器
transfer = TfidfVectorizer(stop_words=["一个", "所以"])
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None