读取数据
import pandas as pd
corpus=list(pd.read_table('words.txt').iloc[:,0])
#提取语料中的十个句子进行演示
corpus=corpus[10:20]
词特征表示方法
Common Vectorizer usage
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
vectorizer
CountVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=None,
strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b',
tokenizer=None, vocabulary=None)
get_feature_names()可看到所有文本的关键字
vocabulary_可看到所有文本的关键字和其位置
toarray()可看到词频矩阵的结果
corpus
['机子 贴膜 都 贴 好',
'不用 单 贴膜',
'起来',
'系统 不错',
'很快',
'国产 品牌 真 挺不错',
'手机 好用 快递 送 快',
'手机 很 好',
'京东 快递 快',
'手机 一段时间']
X = vectorizer.fit_transform(corpus)
X #稀疏矩阵,不显示具体数据
<10x15 sparse matrix of type '<class 'numpy.int64'>'
with 19 stored elements in Compressed Sparse Row format>
X.toarray() #显示具体数据
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]], dtype=int64)
#
txt_vec1=vectorizer.transform(['我 的 手机 是 世界 上 最 漂亮 的 国产 手机'])
txt_vec1.toarray() #国产、手机对应的值分别为2和1
#查看特征名
vectorizer.get_feature_names()
['一段时间',
'不用',
'不错',
'京东',
'品牌',
'国产',
'好用',
'很快',
'快递',
'手机',
'挺不错',
'机子',
'系统',
'贴膜',
'起来']
↑查看语料分词情况,发现单字都不在词典里
↑ 官方文档说明:The default configuration tokenizes the string by extracting words of at least 2 letters. ##去掉了字符串为1的字
↓修改默认参数,不舍去单字词
vectorizer2 = CountVectorizer(token_pattern=r"(?u)\b\w+\b")
X = vectorizer2.fit_transform(corpus)
#X.toarray()
#查看特征名
vectorizer2.get_feature_names()
['一段时间',
'不用',
'不错',
'京东',
'单',
'品牌',
'国产',
'好',
'好用',
'很',
'很快',
'快',
'快递',
'手机',
'挺不错',
'机子',
'真',
'系统',
'贴',
'贴膜',
'起来',
'送',
'都']
Tf–idf term weighting
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b")
vectorizer
TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
stop_words=None, strip_accents=None, sublinear_tf=False,
token_pattern='(?u)\\b\\w+\\b', tokenizer=None, use_idf=True,
vocabulary=None)
重要参数
max_df/min_df
[0.0, 1.0]内浮点数或正整数, 默认值=1.0
当设置为浮点数时,过滤出现在超过max_df/低于min_df比例的句子中的词语;正整数时,则是超过max_df句句子。
stop_words
list类型
直接过滤指定的停用词
vocabulary
dict类型
只使用特定的词汇
token_pattern
默认:token_pattern='(?u)\\b\\w\\w+\\b'
不忽略单字:token_pattern=r"(?u)\b\w+\b"
注:\b:匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
属性值以及作用
vocabulary_:词汇表:字典型
idf_:返回idf值
stop_words_:返回停用词表
X=vectorizer.fit_transform(corpus)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.externals import joblib
def feat_extran(corpus,tfidf=True,download=True):
if tfidf:
vectorizer = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b")
X=vectorizer.fit_transform(corpus)
if download:
#保存模型
joblib.dump(vectorizer,'tfidf_model2.m')
else:
vectorizer = CountVectorizer(token_pattern=r"(?u)\b\w+\b")
X=vectorizer.fit_transform(corpus)
if download:
joblib.dump(vectorizer,'count_model.m')
return X
X=feat_extran(corpus)
#读取tfidf模型
vectorizer= joblib.load('tfidf_model2.m')
#得到句子对应的tfidf词向量
txt_vec1=vectorizer.transform(['我 的 手机 是 世界 上 最 漂亮 的 国产 手机'])
txt_vec1.toarray()
array([[0. , 0. , 0. , 0. , 0. ,
0. , 0.55792538, 0. , 0. , 0. ,
0. , 0. , 0. , 0.82989112, 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. ]])
#查看tfidf词向量的特征名以及位置
vectorizer.vocabulary_
{'机子': 15,
'贴膜': 19,
'都': 22,
'贴': 18,
'好': 7,
'不用': 1,
'单': 4,
'起来': 20,
'系统': 17,
'不错': 2,
'很快': 10,
'国产': 6,
'品牌': 5,
'真': 16,
'挺不错': 14,
'手机': 13,
'好用': 8,
'快递': 12,
'送': 21,
'快': 11,
'很': 9,
'京东': 3,
'一段时间': 0}
#查看各个词特征的idf值
vectorizer.idf_
array([2.70474809, 2.70474809, 2.70474809, 2.70474809, 2.70474809,
2.70474809, 2.70474809, 2.29928298, 2.70474809, 2.70474809,
2.70474809, 2.29928298, 2.29928298, 2.01160091, 2.70474809,
2.70474809, 2.70474809, 2.70474809, 2.70474809, 2.29928298,
2.70474809, 2.70474809, 2.70474809])
vectorizer.transform(['我 的 手机 是 国产 手机'])
离散表示的问题–稀疏性
Sparsity
As most documents will typically use a very small subset of the words used in the corpus, the resulting matrix will have many feature values that are zeros (typically more than 99% of them).
For instance a collection of 10,000 short text documents (such as emails) will use a vocabulary with a size in the order of 100,000 unique words in total while each document will use 100 to 1000 unique words individually.
In order to be able to store such a matrix in memory but also to speed up algebraic operations matrix / vector, implementations will typically use a sparse representation such as the implementations available in the scipy.sparse package.
详细参数:
input:string{‘filename’, ‘file’, ‘content’}
如果是’filename’,序列作为参数传递给拟合器,预计为文件名列表,这需要读取原始内容进行分析
如果是’file’,序列项目必须有一个”read“的方法(类似文件的对象),被调用作为获取内存中的字节数
否则,输入预计为序列串,或字节数据项都预计可直接进行分析。
encoding:string, ‘utf-8’by default
如果给出要解析的字节或文件,此编码将用于解码decode_error: {‘strict’, ‘ignore’, ‘replace’}
如果一个给出的字节序列包含的字符不是给定的编码,指示应该如何去做。
默认情况下,它是’strict’,这意味着的UnicodeDecodeError将提高,其他值是’ignore’和’replace’
strip_accents: {‘ascii’, ‘unicode’, None}
在预处理步骤中去除编码规则(accents),”ASCII码“是一种快速的方法,仅适用于有一个直接的ASCII字符映射,
"unicode"是一个稍慢一些的方法,
None(默认)什么都不做
analyzer:string,{‘word’, ‘char’} or callable
定义特征为词(word)或n-gram字符,如果传递给它的调用被用于抽取未处理输入源文件的特征序列preprocessor:callable or None(default)
当保留令牌和”n-gram“生成步骤时,覆盖预处理(字符串变换)的阶段
tokenizer:callable or None(default)
当保留预处理和n-gram生成步骤时,覆盖字符串令牌步骤
ngram_range: tuple(min_n, max_n)
要提取的n-gram的n-values的下限和上限范围,在min_n <= n <= max_n区间的n的全部值
stop_words:string {‘english’}, list, or None(default)
如果未english,用于英语内建的停用词列表
如果未list,该列表被假定为包含停用词,列表中的所有词都将从令牌中删除
如果None,不使用停用词。
max_df
可以被设置为范围[0.7, 1.0)的值,基于内部预料词频来自动检测和过滤停用词
lowercase:boolean, default True
在令牌标记前转换所有的字符为小写
token_pattern:string
正则表达式显示了”token“的构成,仅当analyzer == ‘word’时才被使用。两个或多个字母数字字符的正则表达式(标点符号完全被忽略,始终被视为一个标记分隔符)。
max_df: float in range [0.0, 1.0] or int, optional, 1.0 by default
当构建词汇表时,严格忽略高于给出阈值的文档频率的词条,语料指定的停用词。如果是浮点值,该参数代表文档的比例,整型绝对计数值,如果词汇表不为None,此参数被忽略 。
min_df:float in range [0.0, 1.0] or int, optional, 1.0 by default
当构建词汇表时,严格忽略低于给出阈值的文档频率的词条,语料指定的停用词。如果是浮点值,该参数代表文档的比例,整型绝对计数值,如果词汇表不为None,此参数被忽略。max_features: optional, None by default 如果不为None,构建一个词汇表,仅考虑max_features–按语料词频排序,如果词汇表不为None,这个参数被忽略
vocabulary:Mapping or iterable, optional
也是一个映射(Map)(例如,字典),其中键是词条而值是在特征矩阵中索引,或词条中的迭代器。如果没有给出,词汇表被确定来自输入文件。在映射中索引不能有重复,并且不能在0到最大索引值之间有间断。
binary:boolean, False by default
如果未True,所有非零计数被设置为1,这对于离散概率模型是有用的,建立二元事件模型,而不是整型计数
dtype:type, optional 通过fit_transform()或transform()返回矩阵的类型
norm:‘l1’, ‘l2’, or None,optional
范数用于标准化词条向量。None为不归一化
use_idf:boolean, optional
启动inverse-document-frequency重新计算权重
smooth_idf:boolean,optional
通过加1到文档频率平滑idf权重,为防止除零,加入一个额外的文档
sublinear_tf:boolean, optional 应用线性缩放TF,例如,使用1+log(tf)覆盖tf