机器学习之朴素贝叶斯(四)用CountVectorizer(平权统计)的文本分类

CountVectorizer

  • 将文本文档集合转换为令牌计数矩阵
  • 此实现生成使用的计数的稀疏表示
  • 如果不提供先验字典,也不使用分析器这做了一些特征选择然后特征的数量会等于通过分析数据发现的词汇量
# 从sklearn的特征工程的文本模块导入词频统计函数
from sklearn.feature_extraction.text import CountVectorizer
# 该统计方法认为所有词的权重是相等的,在具有大量词汇的文本分类中表现不佳
'''
# 参数
@ input:
	string {'filename', 'file', 'content'}
	如果“filename”,则作为要匹配的参数传递的序列为
	期望是需要读取才能获取的文件名列表
	要分析的原始内容。
	如果是file,序列项必须有一个read方法(类似于file)
	对象),它被调用来获取内存中的字节。
	否则,预期输入为序列字符串或
	字节项将被直接分析。
@ encoding:
	string, 'utf-8' by default.
	如果要分析字节或文件,则使用这种编码解码
@ lowercase:
	boolean, True by default
	在标记之前将所有字符转换为小写
@ tokenizer:
	callable or None (default)
	覆盖字符串标记化步骤,同时保留预处理和n-g生成步骤。
	仅当' ' analyzer == 'word' ' '时才适用
@ stop_words:
	string {'english'}, list, or None (default)
	如果是“english”,则使用一个内置的英语停止词列表。
	“英语”有几个众所周知的问题,你应该注意
	考虑另一种方法(参见:ref: ' stop_words ')。
	如果是列表,则假定该列表包含停止字,所有这些都包含
	将从生成的令牌中删除。
	仅当' ' analyzer == 'word' ' '时才适用。
	如果没有,则不会使用停止词。max_df可以设置为一个值
	在[0.7,1.0]范围内自动检测和过滤停止
	基于语料库内部词汇文档频率的词汇。
@ token_pattern : 
	string
	正则表达式,仅用于表示构成“令牌”的内容
	如果' ' analyzer == 'word' ' '。默认的regexp选择令牌为2
	或更多的字母数字字符(标点符号完全被忽略
	并始终被视为令牌分隔符)。
@ max_df:
	浮动范围[0.0,1.0]或int,默认值为1.0
	在构建词汇表时,忽略具有文档的词汇
	频率严格高于给定的阈值(特定于微粒)
	停止词)。
	如果是浮点数,则该参数表示文档的比例整数
	绝对计数。
	如果词汇表不是None,则忽略此参数。
@ min_df:
	浮动范围[0.0,1.0]或int,默认值为1
	在构建词汇表时,忽略具有文档的词汇
	频率严格低于给定的阈值。这个值也是
	在文献中称为截断。
	如果是浮点数,则该参数表示文档的比例整数
	绝对计数。
	如果词汇表不是None,则忽略此参数。
@ max_features: 
	int或None, default=None
	如果没有的话,建立一个只考虑顶部的词汇表
	max_features按词频在语料库中排序。
	如果词汇表不是None,则忽略此参数。
'''

'''
# Attributes 属性
@ vocabulary_: 
	dict类型
	术语到特征索引的映射。
@ stop_words_:
	集合类型
	被忽略的术语,因为它们要么:
	-出现在太多文档中(' max_df ')
	-文件太少(' min_df ')
	-被功能选择切断(' max_features ')。
	只有在没有提供词汇表的情况下才可用。
'''

典型例题数据

Y,words
1,Chinese Beijing Chinese
1,Chinese Chinese Shanghai
1,Chinese Macao
0,Tokyo Japan Chinese
# 预测数据为['Chinese Chinese Chinese Tokyo Japan']

代码如下

'''
    Y,words
    1,Chinese Beijing Chinese
    1,Chinese Chinese Shanghai
    1,Chinese Macao
    0,Tokyo Japan Chinese
'''

import pandas as pd
# 从sklearn的特征工程的文本模块导入词频统计函数
from sklearn.feature_extraction.text import CountVectorizer
# 导入多分类贝叶斯
from sklearn.naive_bayes import MultinomialNB

# 读取数据
df = pd.read_csv("../datas/bayes_xinxi.txt")
# 建立词频统计模型token_pattern="[a-zA-Z|\u4e00-\u9fa5]+"正则表达式表示以单词或一个中文分词
tfCoder = CountVectorizer(token_pattern="[a-zA-Z|\u4e00-\u9fa5]+")
# 提取次样本
X = df["words"]
# 提取标签类别
Y = df["Y"]
X = tfCoder.fit_transform(X)
print(tfCoder.get_feature_names())
print(X.toarray())

# 建立贝叶斯模型
model = MultinomialNB()
model.fit(X,Y)

# 需要预测的数据
T = ['Chinese Chinese Chinese Tokyo Japan']
# 把T编码 再预测
print(model.predict(tfCoder.transform(T)))

# 效果如下

# 词表
['beijing', 'chinese', 'japan', 'macao', 'shanghai', 'tokyo']
# 词频统计
[[1 2 0 0 0 0]
 [0 2 0 0 1 0]
 [0 1 0 1 0 0]
 [0 1 1 0 0 1]]
# 预测结果
[1]

你可能感兴趣的:(机器学习算法思想及代码实现)