前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法】利用文档-词项矩阵实现文本数据结构化

【算法】利用文档-词项矩阵实现文本数据结构化

作者头像
陆勤_数据人网
发布2018-04-18 17:11:23
2.8K0
发布2018-04-18 17:11:23
举报

“词袋模型”一词源自“Bag of words”,简称 BOW ,是构建文档-词项矩阵的基本思想。对于给定的文本,可以是一个段落,也可以是一个文档,该模型都忽略文本的词汇顺序和语法、句法,假设文本是由无序、独立的词汇构成的集合,这个集合可以被直观的想象成一个词袋,袋子里面就是构成文本的各种词汇。例如,文本内容为“经济发展新常态研究”的文档,用词袋模型可以表示为[经济,发展,新常态,研究]四个独立的词汇。词袋模型对于词汇的独立性假设,简化了文本数据结构化处理过程中的计算,被广泛采用,但是另一方面,这种假设忽略了词汇之间的顺序和依赖关系,降低了模型对文本的代表性。

“文档-词项矩阵”一词源自“Document-Term Matrix”,简称 DTM,DTM 矩阵转置后即为 TDM。 我们在第一章简单介绍过文档-词项矩阵的构成,直观来看,矩阵的行代表文档,列代表词汇,矩阵元素即为文档中某一词汇出现的次数。例如,有以下两个文档:文档一[经济,发展,新常态,研究],文档二[大数据,安全,隐私,保护],基于这两个文档构造一个词典:{1:”经济”, 2. “发展”, 3. “新常态”, 4. “研究”, 5. “大数据”, 6. “安全”, 7. “隐私”,8. “保护”},这个词典一共包含 8 个不同的词汇,利用词典的索引号,上面两个文档都可以用一个 8 维的向量表示:(1,1, 1,1,0,0,0,0)和(0,0,0,0,1,1,1,1),向量元素表示对应维度的词汇在文档中出现的次数,两个向量合并在一起即得到文档-词项矩阵。

虽然文档-词项矩阵没有考虑到词汇之间的依存关系,但是这一简单假设也大大简化了后续文本挖掘的计算过程,利用结构化处理的文档-词项矩阵已经可以实现很多有意义的分析过程,如计算文档之间的相关性、文本分类、文本聚类等等。

利用 scikit-learn 库构建文档-词频矩阵

除了常用的机器学习算法外,scikit-learn 库还提供了很多数据结构化处理的工具,将这类结构化处理统称为“Feature Extraction”,即“特征抽取”,文本中的词汇出现的次数就属于“特征”中的一种。通过 sklearn.feature_extraction 包实现相关操作,该包包括从文本和图像中进行特征抽取的方法。

1 sklearn.feature_extraction.text.CountVectorizer

sklearn.feature_extraction.text 是 sklearn.feature_extraction 包中进行文本数据结构化处理的模块,其中定义的 CountVectorizer 类可以同时实现分词处理和词频统计,并得到文档-词频矩阵。 实例化方式为:实例=CountVectorizer(input=u'content', encoding=u'utf-8', decode_error=u'strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=u'(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer=u'word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=)

参数说明:

input:有以下三种取值类型 (1)filename:文本内容的文件名 (2)file:有“read”方法的对象,如 file 对象 (3)content:需要处理的文本

encoding:解码参数,默认取值为“utf-8”

decode_error:若需要分析的字符串中包含未能解码字符,可以利用该参数设置处理方案,有以下三种方案: (1)strict:默认缺失值,出现异常报错 (2)ignore:忽略异常情况 (3)replace

analyzer:指定特征项为词(word)还是 n-grams 字符(按照 n 个字符对语句进行划分),有以下几种取值: (1)word:指定特征项为词 (2)char:指定特征项为 n-grams 字符 (3)char_wb:仅从文本中词边界创建 n-gram 字符 如果传递一个用来提取特征的可调用函数,那么就按照被传递的函数进行处理

preprocessor:利用可调用函数改写预测处理函数,同时保留分词和 n-grams 的处理过程,默认缺失值为“None”

tokenizer:利用可调用函数改写分词步骤,同时保留预处理和 n-grams 的处理过程,默认缺失值为“None”

ngram_range:设置 n-gram 字符中 “n" 上下界的参数,取值类型为数组(min_n, max_n),所有 min_n <= n <= max_n 的 n 值都会被使用

stop_words:停用词设置参数,有以下三种取值: (1)字符串“english”:使用内建的英文停用词表 (2)自定义停用词列表:列表中词汇将会从分词结果中删除,只有当参数 analyzer == 'word' 时才可以进行此项设置 (3)None:不使用停用词,可以将参数 max_df 取值设置为 [0.7, 1.0) 基于内部语料库词频自动识别、过滤停用词

lowercase:在分词前是否将所有字符都转换为小写形式,默认缺失值为 “True”

token_pattern:规定分词原理的正则表达式,仅在 analyzer == ‘word’ 时才可设置。默认的正则表达式是选择两个或者两个以上的字符(忽略标点符号,将其作为分词依据)

max_df:阈值参数,构建字典时,忽略词频明显高于该阈值(语料库的停用词)的词项。如果参数取值是浮点数,则代表了文档比例,如果是整数,则代表计数值。当字典非空时,这个参数会被忽略。

min_df:阈值参数,构建字典时,忽略词频明显低于该阈值的词项,也被成为截止值。如果参数取值是浮点数,则代表了文档比例,如果是整数,则代表计数值。当字典非空时,这个参数会被忽略。

max_features:如果该参数取值非 None,构建词典的时候仅仅考虑语料库里词频最高的那些特征,如果词典非空,这个参数将被忽略。

(1)fit_transform 方法

对 CountVectorizer 类调用 fit_transform 方法可以得到文档词项矩阵,调用方式为:实例.fit_transform(raw_documents),raw_documents 即为需要结构化处理的字符串或 file 对象。

2 sklearn.feature_extraction.text.HashingVectorizer

利用 CountVectorizer 类构建文档词频矩阵时,需要调用两次文档集合,一次用于创建词典,一次用于创建每个文档对应的词频向量,两次调用会导致内存消耗较大。HashingVectorizer 类通过哈希(hashing)技巧,不创建字典,有效的缓解了这一问题。HashingVectorizer 类实例化方式为:实例=HashingVectorizer(input=u'content', encoding=u'utf-8', decode_error=u'strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=u'(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer=u'word', n_features=1048576, binary=False, norm=u'l2', non_negative=False, dtype=)

部分参数说明:

n_features:用于设置输出矩阵的列数,数值过小可能会引起哈希冲突,数值过大会导致维度过高

norm:指定标准化矩阵的方式,有以下三种取值 (1)l1:利用 l1 范数进行标准化 (2) l2:利用 l2 范数进行标准化 (3) None:不进行标准化处理

non_negative:输出矩阵中是否只包括非负值,取值为 True 时,矩阵元素可以理解为频率,取值为 False 时,输出结果期望值为零

其余参数说明可以参考 5.1.3.1 CountVectorizer 类实例化参数。

对 HashingVectorizer 类调用 fit_transform 方法即可得到哈希文档词频矩阵

3 sklearn.feature_extraction.DictVectorizer 模块

有时对文本数据进行分词和词频统计汇总后,得到的结果会直接以键、值的形式存储为字典格式,例如文档“text mining text analysis”,可以存储为 {'text': 2, 'mining': 1, 'analysis': 1} ,如何将此种类型的文本分析结果转换为 DTM 呢?

DictVectorizer 模块下定义的 DictVectorizer 类可以将字典形式的特征表示转换为 Numpy 数组形式,对于分类变量采用“one-hot coding”表示。对于“one-hot coding”可以这样理解:如果分类变量有 A、B、C 三个取值,利用“one-hot coding”可以依次表示为(1,0,0)、(0,1,0)、(0,0,1),相当于统计学中的虚拟变量。DictVectorizer 类实例化方式为:实例=DictVectorizer(dtype=, separator='=', sparse=True, sort=True)

参数说明:

dtype:可选变量,特征值数据类型,通过该参数传入 Numpy array 或 scipy.sparse 矩阵构造器

separator:可选变量,构建新的“one-hot coding”特征值时使用的分隔符

sparse:可选变量,是否生成 scipy.sparse 矩阵

sort:可选变量,是否输出 featurenames 和 vocabulary 两个属性,属性 feature_names 是特征名称列表,对应文档中的词汇项,vocabulary_ 是特征名称与相应 id 的字典

(1)fit_transform 方法

对 DictVectorizer 类调用 fit_transform 方法可以实现特征表示的数组形式转换,调用方式为:实例.fit_transform(X),X 即为需要转换的字典类型的特征表示。比如在下例中,measurements 是以字典存储的特征表示,其中“city”属于分类变量,“temperature”属于数值型变量,现要将其转换为数组形式。

(2) inverse_transform 方法

inverse_transform 方法是 fit_transform 的逆方法,调用方式为:实例.inverse_transform(Y),其中 Y 是需要转换为字典类型特征表示的数组

链接:https://datartisan.gitbooks.io/begining-text-mining-with-python/content/%E7%AC%AC5%E7%AB%A0%20%E6%96%87%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%8C%96%E5%A4%84%E7%90%86/5.1%20%E6%96%87%E6%A1%A3-%E8%AF%8D%E9%A1%B9%E7%9F%A9%E9%98%B5.html

想加入数据人圈子或者商务合作,请加微信luqin360。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学与人工智能 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用 scikit-learn 库构建文档-词频矩阵
    • 1 sklearn.feature_extraction.text.CountVectorizer
      • 2 sklearn.feature_extraction.text.HashingVectorizer
        • 3 sklearn.feature_extraction.DictVectorizer 模块
        相关产品与服务
        大数据
        全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档