【精通特征工程】学习笔记Day2&2.5&D3章&P33-页

3、文本数据:扁平化、过滤和分块

3.1 元素袋:将自然文本转换为扁平向量

3.1.1 词袋

一个特征就是一个单词,一个特征向量由这个单词在每篇文档中出现的次数组成

3.1.2 n 元词袋

n-gram(n 元词)是由 n 个标记 (token)组成的序列。
1-gram 就是一个单词(word),又称为一元词(unigram)。
n越大,能表示的信息越丰富,相应的成本也会越高。

  • eg:计算 n-gram
>>> import pandas>>> import json>>> from sklearn.feature_extraction.text import CountVectorizer
# 加载前10 000条点评
>>> f = open('data/yelp/v6/yelp_academic_dataset_review.json') >>> js = []
>>> for i in range(10000):
... js.append(json.loads(f.readline()))
>>> f.close()
>>> review_df = pd.DataFrame(js)
# 创建一元词、二元词和三元词的特征转换器。
# 默认情况下,会忽略单字母词,这非常有实际意义, # 因为会除去无意义的词。但在这个例子中,
# 出于演示的目的,我们会显式地包含这些词。>>> bow_converter = CountVectorizer(token_pattern='(?u)\\b\\w+\\b')
>>> bigram_converter = CountVectorizer(ngram_range=(2,2),
...                                    token_pattern='(?u)\\b\\w+\\b')
>>> trigram_converter = CountVectorizer(ngram_range=(3,3),
...                                     token_pattern='(?u)\\b\\w+\\b')
# 拟合转换器,查看词汇表大小
>>> bow_converter.fit(review_df['text'])
>>> words = bow_converter.get_feature_names()
>>> bigram_converter.fit(review_df['text'])
>>> bigrams = bigram_converter.get_feature_names() >>> trigram_converter.fit(review_df['text'])
>>> trigrams = trigram_converter.get_feature_names() >>> print (len(words), len(bigrams), len(trigrams)) 26047 346301 847545
# 看一下n-gram
>>> words[:10]
['0', '00', '000', '0002', '00am', '00ish', '00pm', '01', '01am', '02']
>>> bigrams[-10:]
['zucchinis at','zucchinis took','zucchinis we','zuma over','zuppa di','zuppa toscana','zuppe di','zurich and','zz top','à la']
>>> trigrams[:10]
['0 10 definitely','0 2 also','0 25 per','0 3 miles','0 30 a','0 30 everything','0 30 lb','0 35 tip','0 5 curry',
'0 5 pork']

Yelp 数据集前 10 000 条点评中唯一 n-gram 的数量:

3.2 使用过滤获取清洁特征

3.2.1 停用词

停用词列表

3.2.2 基于频率的过滤
  1. 高频词
  2. 罕见词
3.2.3 词干提取
  • eg:Python 的 NLTK 包运行 Porter stemmer 的例子。它适用于很多情况,但不是万能的。
    如:“goes”被映射到了“goe”,而“go”被映射到了它本身。
>>> import nltk
>>> stemmer = nltk.stem.porter.PorterStemmer()
>>> stemmer.stem('flowers')
u'flower'
>>> stemmer.stem('zeroes')
u'zero'
>>> stemmer.stem('stemmer')
u'stem'
>>> stemmer.stem('sixties')
u'sixti'
>>> stemmer.stem('sixty')
u'sixty'
>>> stemmer.stem('goes')
u'goe'
>>> stemmer.stem('go')
u'go'

词干提取并不是非做不可

3.3 意义的单位:从单词、n 元词到短语

3.3.1 解析与分词
  • 解析
  • 半结构化文档,比如 JSON 字符串或 HTML 页面

  • 网页,那么解析程序还需要处理 URL

  • 电子邮件,像发件人、收件人和标题这些域都需要特殊处理

  • 否则这些信息在最终计数中就会和普通词一样,也就失去作用了

  • 分词
  • 空格

  • 标点符号

3.3.2 通过搭配提取进行短语检测
  1. 基于频率的方法

  2. 用于搭配提取的假设检验

  • 通过似然比检验这种分析方法来检测常见短语的算法如下:
    (1) 计算出所有单词的出现概率:P(w)。
    (2) 对所有的唯一二元词,计算出成对单词出现的条件概率:P(w2 | w1)。
    (3) 对所有的唯一二元词,计算出似然比 log λ。
    (4) 按照似然比为二元词排序。
    (5) 将似然比最小的二元词作为特征。
  1. 文本分块和词性标注
  • 文本分块要比找出 n 元词复杂一些,它要使用基于规则的模型并基于词性生成标记序列。

  • 为了找出这些短语,我们先切分出所有带词性的单词,然后检查这些标记的邻近词,找出按词性组合的词组,这些词组又称为“块”。将单词映射到词性的模型通常与特定的语言有关。一些开源的 Python 程序库(比如 NLTK、spaCy 和
    TextBlob)中带有适用于多种语言的模型。

  • eg:词性标注和文本分块

>>> import pandas as pd>>> import json
# 加载前10条点评
>>> f = open('data/yelp/v6/yelp_academic_dataset_review.json') >>> js = []
>>> for i in range(10):
... js.append(json.loads(f.readline()))
>>> f.close()
>>> review_df = pd.DataFrame(js)
# 首先使用spaCy中的函数 >>> import spacy
# 预先加载语言模型
>>> nlp = spacy.load('en')
# 我们可以创建一个spaCy nlp变量的Pandas序列 >>> doc_df = review_df['text'].apply(nlp)
# spaCy可以使用(.pos_)提供细粒度的词性,
# 使用(.tag_)提供粗粒度的词性
>>> for doc in doc_df[4]:
... print([doc.text, doc.pos_, doc.tag_])
Got VERB VBP
a DET DT
letter NOUN NN
in ADP IN
the DET DT
mail NOUN NN
last ADJ JJ
week NOUN NN
that ADJ WDT
said VERB VBD
Dr. PROPN NNP
Goldberg PROPN NNP
is VERB VBZ
moving VERB VBG
to ADP IN
Arizona PROPN NNP
to PART TO
take VERB VB
a DET DT
new ADJ JJ
position NOUN NN
there ADV RB
in ADP IN
June PROPN NNP
. PUNCT .SPACE SP
He PRON PRP
will VERB MD
be VERB VB
missed VERB VBN
very ADV RB
much ADV RB
. PUNCT .
SPACE SP
I PRON PRP
think VERB VBP
finding VERB VBG
a DET DT
new ADJ JJ
doctor NOUN NN
in ADP IN
NYC PROPN NNP
that ADP IN
you PRON PRP
actually ADV RB
like INTJ UH
might VERB MD
almost ADV RB
be VERB VB
as ADV RB
awful ADJ JJ
as ADP IN
trying VERB VBG
to PART TO
find VERB VB
a DET DT
date NOUN NN
! PUNCT .# spaCy还可以进行基本的名词分块
>>> print([chunk for chunk in doc_df[4].noun_chunks])
[a letter, the mail, Dr. Goldberg, Arizona, a new position, June, He, I, a new doctor, NYC, you, a date]
#####
# 我们还可以使用TextBlob实现同样的特征转换 from textblob import TextBlob
# TextBlob中的默认标记器使用PatternTagger,在这个例子中是没有问题的。 # 你还可以指定使用NLTK标记器,它对于不完整的句子效果更好。
>>> blob_df = review_df['text'].apply(TextBlob)
>>> blob_df[4].tags
[('Got', 'NNP'),
('a', 'DT'),
('letter', 'NN'),
('in', 'IN'),
('the', 'DT'),
('mail', 'NN'),
('last', 'JJ'),
('week', 'NN'),
('that', 'WDT'),
('said', 'VBD'),
('Dr.', 'NNP'),
('Goldberg', 'NNP'),
('is', 'VBZ'),
('moving', 'VBG'),
('to', 'TO'),
('Arizona', 'NNP'),
('to', 'TO'),
('take', 'VB'),
('a', 'DT'),
('new', 'JJ'),
('position', 'NN'),
('there', 'RB'),
('in', 'IN'),
('June', 'NNP'),
('He', 'PRP'),
('will', 'MD'),
('be', 'VB'),
('missed', 'VBN'),
('very', 'RB'),
('much', 'JJ'),
('I', 'PRP'),
('think', 'VBP'),
('finding', 'VBG'),
('a', 'DT'),
('new', 'JJ'),
('doctor', 'NN'),
('in', 'IN'),
('NYC', 'NNP'),
('that', 'IN'),
('you', 'PRP'),
('actually', 'RB'),
('like', 'IN'),
('might', 'MD'),
('almost', 'RB'),
('be', 'VB'),
('as', 'RB'),
('awful', 'JJ'),
('as', 'IN'),
('trying', 'VBG'),
('to', 'TO'),
('find', 'VB'),
('a', 'DT'),
('date', 'NN')]
>>> print([np for np in blob_df[4].noun_phrases])
['got', 'goldberg', 'arizona', 'new position', 'june', 'new doctor', 'nyc']

参考:《精通特征工程》爱丽丝·郑·阿曼达·卡萨丽

面向机器学习的特征工程学习笔记:
【精通特征工程】学习笔记(一)

【精通特征工程】学习笔记(二)相关推荐

  1. 【数据挖掘】心跳信号分类预测 之 特征工程 —— 学习笔记(三)

    目录 三.特征工程 3.1 特征工程概述 3.2 学习目标 3.3 内容介绍 3.4 代码与理论学习 3.4.1 安装.导入依赖并读取数据 3.4.2 数据预处理 3.4.3 使用 tsfresh 进 ...

  2. wxpython应用程序对象与顶级窗口_wxPython学习笔记(二)

    如何创建和使用一个应用程序对象? 任何wxPython应用程序都需要一个应用程序对象.这个应用程序对象必须是类wx.App或其定制的子类的一个实例.应用程序对象的主要目的是管理幕后的主事件循环. 父类 ...

  3. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  4. 项目管理学习笔记二:信息系统服务管理

    项目管理学习笔记二:信息系统服务管理 2010-10-22 09:56:33 标签:信息系统 笔记 项目管理 服务 学习 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ...

  5. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  6. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  7. CAS单点登录学习笔记二之部署CAS Server

    CAS Server 服务器部署 [b]简介[/b] CAS Server 是一套基于 Java 实现的服务,该服务以一个 Java Web Application 单独部署在与 servlet2.3 ...

  8. 精通特征工程 —— 2.简单得数字奇特技巧

    文章目录 1.二值化 2.区间量化(分箱) 3.对数变换 4.特征缩放归一化 5.交互特征 6.特征选择 精通特征工程pdf:链接:https://pan.baidu.com/s/11AFe7LgjY ...

  9. Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用

    Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用 大概要写到结尾了,最后几篇就将手册的各常用命令再看一遍,组合一下,并列举出常见的一些有用的操作. DATA_COLOR_MAP数 ...

最新文章

  1. Java Date 和 Calendar
  2. 使用python3 解析html对称标签
  3. usb转pci_IT-GO PCI-E转USB转接卡台式机pcie转2口usb3.0扩展卡后置集线卡
  4. error: 'syms' undefined near line 1 column 1
  5. Mybatis的mapper标签 namespace属性说明
  6. calibre for linux,calibre - 下载Linux版
  7. 腾讯副总裁程武取代吴文辉接管阅文集团 后者开盘涨近4%
  8. AC自动机 学习链接
  9. 谁还 Care 戴尔?
  10. mysql连接量设置_mysql连接数设置操作方法(Too many connections)
  11. oracle 错误码1438,一次ora-01438错误的处理
  12. python基础教程百度云-python从入门到精通视频百度云盘下载
  13. 特征选择-相关系数法F检验
  14. 狄利克雷分布公式_(转)Gamma分布,Beta分布,Multinomial多项式分布,Dirichlet狄利克雷分布...
  15. 【ES6】ES6简介,ES6常用操作,let 、var和const的区别,看完我写的ES6,马上会的,你就是高手
  16. python读取xls文件_用python脚本 从xls文件中读取数据
  17. oracle hugepage设置,Linux系统下快速配置HugePages的完整步骤
  18. 【机器学习-分类】决策树预测
  19. 利用python下载钉钉群直播视频
  20. 学渣的刷题之旅 leetcode刷题 70.爬楼梯(动态规划)

热门文章

  1. bo耳机h5使用说明_给想浅尝便携hifi耳机的烧友的一点建议
  2. pytorch_nicp编译
  3. 滴滴进军实物电商后,阿里发力网约车
  4. 7的倍数和末尾含7的数
  5. 软件开发向大数据开发过渡_如何将职业过渡到Web开发
  6. 如何推广微信公众号 微信公众号推广技巧
  7. MySQL实现连表查询
  8. linux 内核 视频 下载地址,Linux内核视频教程种子链接
  9. python中print()的作用是什么_在python中最常见的:print的真正用法
  10. 一点、两点、三点透视投影的python3实现-计算机图形学