06词特征表示实践

读取数据

import pandas as pd
corpus=list(pd.read_table('words.txt').iloc[:,0])
#提取语料中的十个句子进行演示
corpus=corpus[10:20]

词特征表示方法

Common Vectorizer usage

sklearn

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值