词袋模型

http://blog.csdn.net/pipisorry/article/details/41957763

文本特征提取

词袋(Bag of Words)表征

文本分析是机器学习算法的主要应用领域。但是,文本分析的原始数据无法直接丢给算法,这些原始数据是一组符号,因为大多数算法期望的输入是固定长度的数值特征向量而不是不同长度的文本文件。为了解决这个问题,scikit-learn提供了一些实用工具可以用最常见的方式从文本内容中抽取数值特征,比如说:

  • 标记(tokenizing)文本以及为每一个可能的标记(token)分配的一个整型ID ,例如用白空格和标点符号作为标记的分割符(中文的话涉及到分词的问题)
  • 计数(counting)标记在每个文本中的出现频率
  • 正态化(nomalizating) 降低在大多数样本/文档中都出现的标记的权重

在这个方案中,特征和样本的定义如下:

每个标记出现的频率(无论是否正态化)作为特征

给定文件中所有标记的出现频率所构成的向量作为多元样本

因此,语料文件可以用一个词文档矩阵代表,每行是一个文档,每列是一个标记(即词)。

将文档文件转化为数值特征的一般过程被称为向量化。这个特殊的策略(标记,计数和正态化)被称为词袋或者Bag of n-grams表征。用词频描述文档,但是完全忽略词在文档中出现的相对位置信息。

稀疏性

大多数文档通常只会使用语料库中所有词的一个子集,因而产生的矩阵将有许多特征值是0(通常99%以上都是0)。

例如,一组10,000个短文本(比如email)会使用100,000的词汇总量,而每个文档会使用100到1,000个唯一的词。

为了能够在内存中存储这个矩阵,同时也提供矩阵/向量代数运算的速度,通常会使用稀疏表征例如在scipy.sparse包中提供的表征。

通用向量使用

CountVectorizer在一个类中实现了标记和计数:

from sklearn.feature_extraction.text import CountVectorizer

这个模型有许多参数,不过默认值已经非常合理(具体细节请见参考文档):

vectorizer = CountVectorizer(min_df=1)
vectorizer

CountVectorizer(analyzer=...‘word‘, binary=False, charset=None,
        charset_error=None, decode_error=...‘strict‘,
        dtype=<... ‘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)

让我们用它来标记和计算一个简单语料的词频:

corpus = [
     ‘This is the first document.‘,
     ‘This is the second second document.‘,
     ‘And the third one.‘,
     ‘Is this the first document?‘,
 ]
X = vectorizer.fit_transform(corpus)
X                              

<4x9 sparse matrix of type ‘<... ‘numpy.int64‘>‘
    with 19 stored elements in Compressed Sparse Column format>

默认设置通过抽取2个字符以上的词标记字符。完成这个步骤的具体函数可以直接调用:

analyze = vectorizer.build_analyzer()
analyze("This is a text document to analyze.") == (
     [‘this‘, ‘is‘, ‘text‘, ‘document‘, ‘to‘, ‘analyze‘])

True

在拟合过程中,每一个分析器找到的词都会分配一个在结果矩阵中对应列的整型索引。列的含义可以用下面的方式获得:

vectorizer.get_feature_names() == (
     [‘and‘, ‘document‘, ‘first‘, ‘is‘, ‘one‘,
      ‘second‘, ‘the‘, ‘third‘, ‘this‘])

True

X.toarray()
array([[0, 1, 1, 1, 0, 0, 1, 0, 1],
       [0, 1, 0, 1, 0, 2, 1, 0, 1],
       [1, 0, 0, 0, 1, 0, 1, 1, 0],
       [0, 1, 1, 1, 0, 0, 1, 0, 1]]...)

特征名称与列索引的转化映射被存储在向量器(vectorizer)的vocabulary_属性中:

vectorizer.vocabulary_.get(‘document‘)

1

因此,在训练语料中没有出现的词在后续调用转化方法时将被完全忽略:

vectorizer.transform([‘Something completely new.‘]).toarray()

array([[0, 0, 0, 0, 0, 0, 0, 0, 0]]...)

注意在前面的语料中,第一个和最后一个文档的词完全相同因此被编码为等价的向量。但是,我们丢失了最后一个文档是疑问形式的信息。为了保留一些局部顺序信息,我们可以在抽取词的1-grams(词本身)之外,再抽取2-grams:

bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
                                     token_pattern=r‘\b\w+\b‘, min_df=1)
analyze = bigram_vectorizer.build_analyzer()
analyze(‘Bi-grams are cool!‘) == (
     [‘bi‘, ‘grams‘, ‘are‘, ‘cool‘, ‘bi grams‘, ‘grams are‘, ‘are cool‘])

True

因此,由这个向量器抽取的词表非常大,现在可以解决由于局部位置模型编码的歧义问题:

X_2 = bigram_vectorizer.fit_transform(corpus).toarray()
X_2
...
array([[0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0],
       [0, 0, 1, 0, 0, 1, 1, 0, 0, 2, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0],
       [1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1]]...)

特别是疑问形式“Is this”只出现在最后一个文档:

feature_index = bigram_vectorizer.vocabulary_.get(‘is this‘)
X_2[:, feature_index]     

array([0, 0, 0, 1]...)
时间: 2024-10-08 15:25:51

词袋模型的相关文章

【CV知识学习】【转】beyond Bags of features for rec scenen categories。基于词袋模型改进的自然场景识别方法

原博文地址:http://www.cnblogs.com/nobadfish/articles/5244637.html 原论文名叫Byeond bags of features:Spatial Pyramid Matching for Recognizing Natural Scene Categories. 这篇文章的中心思想就是基于词袋模型+金字塔结构的识别算法.首先简单介绍词袋模型. 1.词袋模型 Bag of words模型也成为“词袋”模型,在最初多是用来做自然语言处理,Svetla

开源词袋模型DBow3原理&amp;源码

前人摘树,后人乘凉. 源码在github有CMakeLists,代码下下来可以直接编译. 泡泡机器人有个很详细的分析,结合浅谈回环检测中的词袋模型,配合高翔的回环检测应用,基本上就可以串起来了. tf-idf的概念,表达方式不唯一,这里的定义是这样: tf表示词频,这个单词在图像中出现的次数/图像单词总量 idf表示单词在整个训练语料库中的常见程度:idf=log(N/Ni),N是训练语料库中的图片总数,Ni是训练语料库中包含这个单词的图像数 由于Ni<=N,idf>=0,当Ni=N时,idf

机器学习---文本特征提取之词袋模型(Machine Learning Text Feature Extraction Bag of Words)

假设有一段文本:"I have a cat, his name is Huzihu. Huzihu is really cute and friendly. We are good friends." 那么怎么提取这段文本的特征呢? 一个简单的方法就是使用词袋模型(bag of words model).选定文本内一定的词放入词袋,统计词袋内所有词出现的频率(忽略语法和单词出现的顺序),把词频(term frequency)用向量的形式表示出来. 词频统计可以用scikit-learn

机器学习入门-文本数据-构造词频词袋模型 1.re.sub(进行字符串的替换) 2.nltk.corpus.stopwords.words(获得停用词表) 3.nltk.WordPunctTokenizer(对字符串进行分词操作) 4.np.vectorize(对函数进行向量化) 5. CountVectorizer(构建词频的词袋模型)

函数说明: 1. re.sub(r'[^a-zA-Z0-9\s]', repl='', sting=string)  用于进行字符串的替换,这里我们用来去除标点符号 参数说明:r'[^a-zA-Z0-9\s]' 配对的模式,^表示起始位置,\s表示终止位置,[]表示取中间部分,这个的意思是找出除字符串大小写或者数字组成以外的东西,repl表示使用什么进行替换,这里使用'',即直接替换,string表示输入的字符串 2. stopwords = nltk.corpus.stopwords.word

机器学习入门-文本数据-构造Tf-idf词袋模型(词频和逆文档频率) 1.TfidfVectorizer(构造tf-idf词袋模型)

TF-idf模型:TF表示的是词频:即这个词在一篇文档中出现的频率 idf表示的是逆文档频率, 即log(文档的个数/1+出现该词的文档个数)  可以看出出现该词的文档个数越小,表示这个词越稀有,在这篇文档中也是越重要的 TF-idf: 表示TF*idf, 即词频*逆文档频率 词袋模型不仅考虑了一个词的词频,同时考虑了这个词在整个语料库中的重要性 代码: 第一步:使用DataFrame格式处理数据,同时数组化数据 第二步:定义函数,进行分词和停用词的去除,并使用' '连接去除停用词后的列表 第三

文本离散表示(一):词袋模型(bag of words)

一.文本表示 文本表示的意思是把字词处理成向量或矩阵,以便计算机能进行处理.文本表示是自然语言处理的开始环节. 文本表示按照细粒度划分,一般可分为字级别.词语级别和句子级别的文本表示.字级别(char level)的如把“邓紫棋实在太可爱了,我想养一只”这句话拆成一个个的字:{邓,紫,棋,实,在,太,可,爱,了,我,想,养,一,只},然后把每个字用一个向量表示,那么这句话就转化为了由14个向量组成的矩阵. 文本表示分为离散表示和分布式表示.离散表示的代表就是词袋模型,one-hot(也叫独热编码

文本情感分析(一):基于词袋模型(VSM、LSA、n-gram)的文本表示

现在自然语言处理用深度学习做的比较多,我还没试过用传统的监督学习方法做分类器,比如SVM.Xgboost.随机森林,来训练模型.因此,用Kaggle上经典的电影评论情感分析题,来学习如何用传统机器学习方法解决分类问题. 通过这个情感分析的题目,我会整理做特征工程.参数调优和模型融合的方法,这一系列会有四篇文章.这篇文章整理文本特征工程的内容. 文本的特征工程主要包括数据清洗.特征构造.降维和特征选择等. 首先是数据清洗,比如去停用词.去非字母汉字的特殊字符.大写转小写.去掉html标签等. 然后

词袋模型(BOW,bag of words)和词向量模型(Word Embedding)概念介绍

例句: Jane wants to go to Shenzhen. Bob  wants to go to Shanghai. 一.词袋模型 将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的.例如上面2个例句,就可以构成一个词袋,袋子里包括Jane.wants.to.go.Shenzhen.Bob.Shanghai.假设建立一个数组(或词典)用于映射匹配 1 [Jane, wants, to, go, Shenzhen, Bob, Shanghai] 那么上面两个例句就可

开源词袋模型DBow3原理&amp;源码(二)ORB特征的保存和读取

util里提供了create_voc_step0用于批量生成features并保存,create_voc_step1读入features再生成聚类中心,比较适合大量语料库聚类中心的生成. 提取一张图的特征如下: 第一行是文件头,分别用32bit表示特征来自几张图(1).特征描述子长度(128bit,=32B), 特征长度(89), 特征类型(cv8u) ./utils/create_voc_step0 orb fea0 zs00.jpg Extracting features... readin