nlp数据预处理:词库、词典与语料库
在nlp的数据预处理中,我们通常需要根据原始数据集做出如题目所示的三种结构。但是新手(我自己)常常会感到混乱,因此特意整理一下
1.词库
词库是最先需要处理出的数据形式,即将原数据集按空格分词或者使用分词的包如jieba等,将原始文章分割成一个个词语所表示的list,一般是一维或者二维的,二维词库往往是以行为第一维。
比如下面我们对ptb数据集进行处理产生对应的词库
with open('ptb/ptb.train.txt') as f:
raw_txt = f.read()
sentences = [line.split() for line in raw_txt.split('\n')]
或者在一些情况下,我们只需要统计出现过的词汇,使用set结构体进行处理即可
wordSet = set([word for word in line for line in sentence])
2.词典
在词典中我们主要做的工作是,统计词频,按照频率进行排序,排序主要是为了让频率高的词有较小的编号,若某些单词出现的次数低于某个界限值,如10,我们通常将它转化为特殊词元如''等,然后对单词进行token到id的转化和id到token的转化。下面的代码来自李沐老师的d2l库,相当完美的实现了字典的功能,可以直接使用vocab[token]来查询到id,使用len函数查询长度等。
#构建词表
class Vocab:
def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):
if tokens is None:
tokens = []
if reserved_tokens is None:
reserved_tokens = []
#将二维token转化为一维列表
if(isinstance(tokens[0], list)):
tokens = [token for line in tokens for token in line]
counter = collections.Counter(tokens)
self._token_freqs = sorted(counter.items(), key=lambda x:x[1],reverse = True)#降序
self.idx_to_token = ['<unk>'] + reserved_tokens
#先对特定的token进行编号
self.token_to_idx = {token : idx for idx, token in enumerate(self.idx_to_token)}
#接着对词语token进行编号
for token, freq in self._token_freqs:
if freq < min_freq:
break
if token not in self.token_to_idx:
self.idx_to_token.append(token)
self.token_to_idx[token] = len(self.idx_to_token) - 1
def __len__(self):
return len(self.idx_to_token)
def __getitem__(self, tokens):
#如果tokens不是列表或元组,就直接查询token,若不存在返回unk,此函数可以直接数组形态访问获得id
if not isinstance(tokens, (list, tuple)):
return self.token_to_idx.get(tokens, self.unk)
return [self.__getitem__(token) for token in tokens]
#装饰器,使得可以不带括号的访问函数
@property
def unk(self):
return 0
@property
def token_freqs(self):
return self._token_freqs
3.语料库corpus
在词典生成完成后,我们就可以将词库中的一个个单词转化为对应的标号,比如原文是['I','LIKE', 'YOU']就可以转化为19, 90, 127,我们使用语料库来进行训练。值得注意的是,在生成语料库之前,由于某些高频词或者停用词的存在(停用词通常也是高频词),提前使用停用词表(github上有资源)将停用词删掉可以有效帮助训练,因为停用词没有意义;或者使用下采样方法,将高频率词按一定概率删除,频率越高,则被删除概率越高,通常使用如下的概率公式:
\]
即单词\(w_i\)被删除的概率。其中t是一个常数,实验取1e-4,\(f(w_i)\)是该单词词频,词频大于t时,才有可能被删除。代码:
# 如果在下采样期间保留词元,则返回True
def keep(token):
return(random.uniform(0, 1) <
math.sqrt(1e-4 / counter[token] * num_tokens))
最后正式转化语料库就很简单了
corpus = [vocab[line] for line in sentences]
还是需要通过多次的实践编写代码才能熟练。
代码都是参考李沐老师的DIVE INTO DEEP LEARNING.
nlp数据预处理:词库、词典与语料库的更多相关文章
- Python的工具包[1] -> pandas数据预处理 -> pandas 库及使用总结
pandas数据预处理 / pandas data pre-processing 目录 关于 pandas pandas 库 pandas 基本操作 pandas 计算 pandas 的 Series ...
- 第一章:AI人工智能 の 数据预处理编程实战 Numpy, Pandas, Matplotlib, Scikit-Learn
本课主题 数据中 Independent 变量和 Dependent 变量 Python 数据预处理的三大神器:Numpy.Pandas.Matplotlib Scikit-Learn 的机器学习实战 ...
- 【自定义IK词典】Elasticsearch之中文分词器插件es-ik的自定义词库
Elasticsearch之中文分词器插件es-ik 针对一些特殊的词语在分词的时候也需要能够识别 有人会问,那么,例如: 如果我想根据自己的本家姓氏来查询,如zhouls,姓氏“周”. 如 ...
- Python: sklearn库——数据预处理
Python: sklearn库 —— 数据预处理 数据集转换之预处理数据: 将输入的数据转化成机器学习算法可以使用的数据.包含特征提取和标准化. 原因:数据集的标准化(服从均值为 ...
- Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
敲<Python机器学习及实践>上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下: ...
- Python数据预处理:机器学习、人工智能通用技术(1)
Python数据预处理:机器学习.人工智能通用技术 白宁超 2018年12月24日17:28:26 摘要:大数据技术与我们日常生活越来越紧密,要做大数据,首要解决数据问题.原始数据存在大量不完整.不 ...
- 【中文同义词近义词】词向量 vs 同义词近义词库
方案一:利用预训练好的词向量模型 优点: (1)能把词进行语义上的向量化(2)能得到词与词的相似度 缺点: (1)词向量的效果和语料库的大小和质量有较大的关系(2)用most_similar() 得到 ...
- 【新人赛】阿里云恶意程序检测 -- 实践记录10.20 - 数据预处理 / 训练数据分析 / TF-IDF模型调参
Colab连接与数据预处理 Colab连接方法见上一篇博客 数据预处理: import pandas as pd import pickle import numpy as np # 训练数据和测试数 ...
- 斯坦福NLP课程 | 第1讲 - NLP介绍与词向量初步
作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...
- Sphinx(coreseek) 安装使用以及词库的扩展
1.Sphinx(coreseek) 是啥 一般而言,Sphinx是一个独立的全文搜索引擎:而Coreseek是一个支持中文的全文搜索引擎,意图为其他应用提供高速.低空间占用.高结果相关度的中文全文搜 ...
随机推荐
- MVCC原理
MVCC MVCC (Multi-Version Concurrency Control) ,即多版本并发控制,利用记录的版本链和ReadView,来控制并发事务访问相同记录时的行为.ReadView ...
- spring java枚举转json 方便前端取值
未处理前: "gender":"GenderEnum.FEMALE(code=2, gender=女)" 解决方法:使用jackson提供的注解 @JsonFo ...
- CentOS 7(Linux)安装docker,执行yum install docker-io -y报错
CentOS 7(Linux)安装Docker,执行yum install docker-io -y报错 一.执行yum install docker-io -y报错 Error: docker-ce ...
- 【原创】freetype android交叉编译
项目中Opencv需要显示中文,由于本身并不支持,所以需要借助第三方的库freetype来实现.这个库虽然android本身也有使用,但并没有暴露接口给外部使用. freetype官网 方式1 脚本编 ...
- Angular架构学习
定义 Angular 是一个用 HTML 和 JavaScript 或者一个可以编译成 JavaScript 的语言(例如 Dart 或者 TypeScript ),来构建客户端应用的框架. 写 An ...
- CentOS基本命令手册
一.磁盘使用情况 两个命令df .du结合比较直观 df -h #查看整台服务器的硬盘使用情况 du -sh * #查看每个文件夹的大小 二.tar 用法 压缩 tar tar -czvf test. ...
- 银行对账单PDF一页拆分多页
一个页拆分多个页,按照流水 String bank = "{\n" + "\t\"bank\" : [\n" + "\t\t{\n ...
- .net core 版本避坑 无法打开项目文件。 无法找到 .NET SDK。请检查确保已安装此项且 global.json 中指定的版本(如有)与所安装的版本相匹配。
打开项目根目录,输入 dotnet --version ,查看本机安装的最高版本的sdk: 如果源文件中存在global.json文件,直接打开修改即可: 不存在则接着在1步骤后输入: dotnet ...
- Abp学习(一) abp+vue +mysql框架搭建
一.到Abp官网下载框架 地址:https://aspnetboilerplate.com/Templates 二.打开项目 修改数据库连接为MySql,默认是SQL Server 2.1.修改链接字 ...
- lc.59 螺旋矩阵 II
题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 输入:n = 3 输出:[[1,2,3],[8,9, ...