python学习 文本特征提取(二) CountVectorizer TfidfVectorizer 中文处理

上一篇博客shuihupo 博客地址,https://blog.csdn.net/shuihupo/article/details/80923414 shuihupo对字典储存的的数据,我们使用CountVectorizer对特征进行抽取和向量化。
在文本数据处理中,我们遇到的经常是一个个字符串,且对于中文来说,经常要处理没有分割符的大段最原始的字符串(这种数据需要先分词,转化为一个分割好的字符串)。
对于这些数据我们会想到它们的哪些特点呢?词,统计他们包含词语的特点。python Scikit-learn 中有两个非常好的工具,CountVectorizer TfidfVectorizer。

目录

CountVectorize 主要是词频特点

  1. 对中文数据进行分词处理
  2. 创建停用词列表,文本转化为代表词频的特征向量(矩阵)
  3. 训练集和测试集分割代码
  4. 关于token_pattern参数:

TfidfVectorizer 逆文档频率

思想

Tfidf考虑到一些非常大众化的词,如“我们”等词,几乎所有或者绝大多数文章都会出现,这些词它们对文本特点刻画的贡献就比较小了(甚至影响),所以考虑要考虑在文本含义中有更高贡献的词啦,这就是逆文档频率的思想。这种方法,文档数目越多,优势更明显。

  1. 对中文数据进行分词处理
  2. 创建停用词列表,文本转化为代表逆文档频率的特征向量(矩阵)
ps:百度百科TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。

CountVectorize

常用数据输入形式为:列表,列表元素为代表文章的字符串,一个字符串代表一篇文章,字符串是已经分割好的

CountVectorizer同样适用于中文

参数表 作用
stop_words 停用词表;自定义停用词表
token_pattern 过滤规则;
>
属性表 作用
vocabulary_ 词汇表;字典型
get_feature_names() 所有文本的词汇;列表型
stop_words_ 返回停用词表

CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在第i个文本下的词频。即各个词语出现的次数,通过get_feature_names()可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。

方法表 作用
fit_transform(X) 拟合模型,并返回文本矩阵

1.对中文数据进行分词处理

a ="自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学"
b = "因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。"
c ="因而它是计算机科学的一部分。自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。"
import jieba
all_list= ['  '.join(jieba.cut(s,cut_all = False)) for s in [a,b,c]]
print(all_list)

分词后的结果为:

['自然语言  处理  是  计算机科学  领域  与  人工智能  领域  中  的  一个  重要  方向  。  它  研究  能  实现  人  与  计算机  之间  用  自然语言  进行  有效  通信  的  各种  理论  和  方法  。  自然语言  处理  是  一门  融  语言学  、  计算机科学  、  数学  于  一体  的  科学', '因此  ,  这一  领域  的  研究  将  涉及  自然语言  ,  即  人们  日常  使用  的  语言  ,  所以  它  与  语言学  的  研究  有着  密切  的  联系  ,  但  又  有  重要  的  区别  。  自然语言  处理  并  不是  一般  地  研究  自然语言  ,  而  在于  研制  能  有效  地  实现  自然语言  通信  的  计算机系统  ,  特别  是  其中  的  软件系统  。', '因而  它  是  计算机科学  的  一部分  。  自然语言  处理  (  NLP  )  是  计算机科学  ,  人工智能  ,  语言学  关注  计算机  和  人类  (  自然  )  语言  之间  的  相互作用  的  领域  。']

对于停用词,可以在这个阶段去除,代码参考https://blog.csdn.net/u012052268/article/details/77825981,不过CountVectorize是有停用词去除的机制的,在这里我在在下一步去除。

关于上面的代码:

要关注分词输出的形式和CountVectorize所需要的数据形式统一。

2.创建停用词列表,文本转化为代表词频的特征向量(矩阵)

#从文件导入停用词表
stpwrdpath ="C:\\Users\\Administrator\Desktop\lect09_codes\lect09_proj\stop_words\\中文停用词库.txt"
with open(stpwrdpath, 'rb') as fp:
    stopword = fp.read().decode('utf-8')  # 提用词提取
#将停用词表转换为list  
stpwrdlst = stopword.splitlines()
# 从sklearn.feature_extraction.text里导入CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
# 对CountVectorizer进行初始化(去除中文停用词)
count_vec=CountVectorizer(stop_words=stpwrdlst) #创建词袋数据结构
X_count_train = count_vec.fit_transform(all_list[:2])  #
# 将原始训练和测试文本转化为特征向量
X_count_train= X_count_train.toarray()
X_count_test = count_vec.transform(all_list[2]).toarray()
print(X_count_train)
#词汇表
print('\nvocabulary list:\n\n',count_vec.get_feature_names())
print( '\nvocabulary dic :\n\n',count_vec.vocabulary_)
print ('vocabulary:\n\n')
for key,value in count_vec.vocabulary_.items():
    print(key,value)

训练集也就是a,b 的词频统计结果,词汇列表、字典为:

[[1 1 1 1 1 0 0 2 1 0 1 1 1 0 1 0 0 0 1 0 1 1 0 3 1 2 0 0 1 0 0 1 1 1 2]
 [0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 3 0 1 4 0 0 1 1 1 1 1 0 1 1 1]]

vocabulary list:

 ['一个', '一体', '一门', '之间', '人工智能', '使用', '区别', '处理', '实现', '密切', '数学', '方向', '方法', '日常', '有效', '有着', '涉及', '特别', '理论', '研制', '研究', '科学', '联系', '自然语言', '计算机', '计算机科学', '计算机系统', '语言', '语言学', '软件系统', '这一', '进行', '通信', '重要', '领域']

vocabulary dic :

 {'区别': 6, '特别': 17, '一体': 1, '数学': 10, '方法': 12, '方向': 11, '计算机科学': 25, '研制': 19, '涉及': 16, '实现': 8, '日常': 13, '有着': 15, '语言学': 28, '这一': 30, '重要': 33, '人工智能': 4, '进行': 31, '理论': 18, '一门': 2, '自然语言': 23, '有效': 14, '通信': 32, '研究': 20, '联系': 22, '使用': 5, '科学': 21, '软件系统': 29, '计算机系统': 26, '领域': 34, '计算机': 24, '密切': 9, '之间': 3, '语言': 27, '一个': 0, '处理': 7}
vocabulary:


区别 6
特别 17
一体 1
数学 10
方法 12
方向 11
计算机科学 25
研制 19
涉及 16
实现 8
日常 13.....

(1)停用词的配置:也可默认配置count_vec=CountVectorizer(stop_words=None) ,stop_words=None表示不去掉停用词;如果是英文的话,停用词不需要构建直接 count_vec=CountVectorizer(stop_words=’english’)则去掉英语停用词
(2)count_vec.fit_transform(data)的结果是如下的格式:

print(count_vec.fit_transform(X_test))
 (data列表中第一个元素,词典里第几个词) 词频
  (0, 7)    2
  (0, 25)   2
  (0, 34)   2
  (0, 4)    1
  (0, 0)    1
  。。。。。
print(count_vec.fit_transform(X_test).toarray())
[[1 1 1 1 1 0 0 2 1 0 1 1 1 0 1 0 0 0 1 0 1 1 0 3 1 2 0 0 1 0 0 1 1 1 2]
 [0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 3 0 1 4 0 0 1 1 1 1 1 0 1 1 1]]

.toarray() 是将结果转化为稀疏矩阵矩阵的表示方式;
(3)每个词在所有文档中的词频

print(cv_fit.toarray()) #'numpy.ndarray'>

['bird', 'cat', 'dog', 'fish']
[[0 1 1 1]
 [0 2 1 0]
[1 0 0 1]
 [1 0 0 0]]
print(cv_fit.toarray().sum(axis=0))
[2 3 2 2]

训练集和测试集分割代码:

数据量大的时候cross_validation分割代码

# 从sklearn.cross_validation导入train_test_split模块用于分割数据集。
from sklearn.cross_validation import train_test_split
# 对news中的数据data进行分割,25%的文本用作测试集;75%作为训练集。
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=33)

关于token_pattern参数:

参考链接为sklearn CountVectorizer按指定字符切分字符串这里写链接内容
python学习 文本特征提取(二) CountVectorizer TfidfVectorizer 中文处理_第1张图片

TfidfVectorizer 逆文档频率

关于Tfid的思想在文头简单说过了,计算的公式就暂且省略了。

参数表 作用
stop_words 停用词表;自定义停用词表
token_pattern 过滤规则;
>
属性表 作用
vocabulary_ 词汇表;字典型
get_feature_names() 所有文本的词汇;列表型
stop_words_ 返回停用词表

1.对中文数据进行分词处理

2.创建停用词列表,文本转化为逆文档词频的特征向量(矩阵)

# -*- coding: utf-8 -*-
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
a ="自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学"
b = "因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。"
c ="因而它是计算机科学的一部分。自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。"
all_list= ['  '.join(jieba.cut(s,cut_all = False)) for s in [a,b,c]]
#从文件导入停用词表
stpwrdpath ="C:\\Users\\Administrator\Desktop\lect09_codes\lect09_proj\stop_words\\中文停用词库.txt"
with open(stpwrdpath, 'rb') as fp:
    stopword = fp.read().decode('utf-8')  # 提用词提取
#将停用词表转换为list  
stopwordlist = stopword.splitlines()
tfidf=TfidfVectorizer(stop_words=stopwordlist)
weight=tfidf.fit_transform(all_list).toarray()
word=tfidf.get_feature_names()
print ('IFIDF词频矩阵:\n')
print (weight) 
----------
for i in range(len(weight)): # 打印每个文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一个文本下的词语权重
    print ("-------这里输出第", i, "个文本的词语tf-idf权重------")
    for j in range(len(word)):
        print(word[j], weight[i][j]) #第i个文本中,第j个词的tfidf值

同样可以仿照CountVectorizer输出词汇表。结果:

IFIDF词频矩阵:

[[0.         0.21214414 0.21214414 0.         0.21214414 0.16134109
  0.16134109 0.         0.         0.         0.         0.25059149
  0.16134109 0.         0.21214414 0.21214414 0.21214414 0.
  0.16134109 0.         0.         0.         0.21214414 0.
  0.         0.16134109 0.21214414 0.         0.         0.37588724
  0.16134109 0.32268217 0.         0.         0.12529575 0.
  0.         0.21214414 0.16134109 0.16134109 0.25059149]
 [0.         0.         0.         0.         0.         0.
  0.         0.         0.19343658 0.         0.19343658 0.11424676
  0.1471135  0.19343658 0.         0.         0.         0.19343658
  0.1471135  0.19343658 0.19343658 0.19343658 0.         0.
  0.19343658 0.44134051 0.         0.19343658 0.         0.45698704
  0.         0.         0.19343658 0.1471135  0.11424676 0.19343658
  0.19343658 0.         0.1471135  0.1471135  0.11424676]
 [0.28840482 0.         0.         0.28840482 0.         0.2193393
  0.2193393  0.28840482 0.         0.28840482 0.         0.17033653
  0.         0.         0.         0.         0.         0.
  0.         0.         0.         0.         0.         0.28840482
  0.         0.         0.         0.         0.28840482 0.17033653
  0.2193393  0.4386786  0.         0.2193393  0.17033653 0.
  0.         0.         0.         0.         0.17033653]]
-------这里输出第 0 个文本的词语tf-idf权重------
nlp 0.0
一个 0.2121441385465931
一体 0.2121441385465931
一部分 0.0
一门 0.2121441385465931
之间 0.16134108547600245
人工智能 0.16134108547600245
人类 0.0
使用 0.0
关注 0.0
区别 0.0
处理 0.2505914913745825
实现 0.16134108547600245
密切 0.0
数学 0.2121441385465931
方向 0.2121441385465931
方法 0.2121441385465931
日常 0.0
有效 0.16134108547600245
有着 0.0
涉及 0.0
特别 0.0
理论 0.2121441385465931
相互作用 0.0
研制 0.0
研究 0.16134108547600245
科学 0.2121441385465931
联系 0.0
自然 0.0
自然语言 0.3758872370618737
计算机 0.16134108547600245
计算机科学 0.3226821709520049
计算机系统 0.0
语言 0.0
语言学 0.12529574568729124
软件系统 0.0
这一 0.0
进行 0.2121441385465931
通信 0.16134108547600245
重要 0.16134108547600245
领域 0.2505914913745825
-------这里输出第 1 个文本的词语tf-idf权重------
nlp 0.0
一个 0.0
一体 0.0
一部分 0.0
一门 0.0
之间 0.0
人工智能 0.0
人类 0.0
使用 0.19343657854281884
关注 0.0
区别 0.19343657854281884
处理 0.11424675938617863
实现 0.14711350389729444
密切 0.19343657854281884
数学 0.0
方向 0.0
方法 0.0
日常 0.19343657854281884
有效 0.14711350389729444
有着 0.19343657854281884
涉及 0.19343657854281884
特别 0.19343657854281884
理论 0.0
相互作用 0.0
研制 0.19343657854281884
研究 0.4413405116918833
科学 0.0
联系 0.19343657854281884
自然 0.0
自然语言 0.45698703754471454
计算机 0.0
计算机科学 0.0
计算机系统 0.19343657854281884
语言 0.14711350389729444
语言学 0.11424675938617863
软件系统 0.19343657854281884
这一 0.19343657854281884
进行 0.0
通信 0.14711350389729444
重要 0.14711350389729444
领域 0.11424675938617863
-------这里输出第 2 个文本的词语tf-idf权重------
nlp 0.28840481933429657
一个 0.0
一体 0.0
一部分 0.28840481933429657
一门 0.0
之间 0.2193392988686609
人工智能 0.2193392988686609
人类 0.28840481933429657
使用 0.0
关注 0.28840481933429657
区别 0.0
处理 0.17033653225522746
实现 0.0
密切 0.0
数学 0.0
方向 0.0
方法 0.0
日常 0.0
有效 0.0
有着 0.0
涉及 0.0
特别 0.0
理论 0.0
相互作用 0.28840481933429657
研制 0.0
研究 0.0
科学 0.0
联系 0.0
自然 0.28840481933429657
自然语言 0.17033653225522746
计算机 0.2193392988686609
计算机科学 0.4386785977373218
计算机系统 0.0
语言 0.2193392988686609
语言学 0.17033653225522746
软件系统 0.0
这一 0.0
进行 0.0
通信 0.0
重要 0.0
领域 0.17033653225522746

学习过了,如何实战呢。下篇博客预告:python学习 文本特征提取(三) CountVectorizer TfidfVectorizer 朴素贝叶斯分类性能测试

你可能感兴趣的:(python自然语言)