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是一个支持中文的全文搜索引擎,意图为其他应用提供高速.低空间占用.高结果相关度的中文全文搜 ...
随机推荐
- Upload上传组件,上传之后,再次预览下载按钮不见问题
如图所示红色部分不见了. 解决方式: fileList 代表的是上传后当前文件内容的具体信息名称,该数据决定了上传之后页面展示的内容 this.fileList.push({ uid:remark.i ...
- NOIP2012普及组
T2]寻宝 读懂题目!! 是逆时针,第几个有钥匙的房间,还有能够直接上楼的是作为第一个有钥匙的房间,而不是就从这里直接上楼了 #include<iostream> #include< ...
- Window10设置技巧
1.关闭应用程序上的最近打开文件,效果图 2.固定到"开始"屏幕,效果图 3.任务栏图标太大了
- 解决git仓库项目 添加到github非空仓库冲突问题 error: failed to push some refs to 'https://github.com/Qtoken/......'
error: failed to push some refs to 'https://github.com/Qtoken/......' 1. 问题描述:执行命令:git push origin m ...
- QT网络编程【二】【Socket】
1.QT中添加socket 库的相关操作 2.正常c++11 VS2019使用socket库的操作 3.winsock2 与 sys/socket.h的区别? 4.WinSock2 的基本操作? 详细 ...
- Openssl自签证书|Nginx配置全站HTTPS,包括WSS(websocket)
一.生成自签证书 如果有购买证书的,可忽略此步骤. 生成方法一: openssl genrsa -des3 -out ca.key 1024 openssl rsa -in ca.key -out c ...
- VBA中的集合
Sub testSet() Dim c As New Collection c.Add ("A") c.Add (2) c.Add ("A") For i = ...
- IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
代码: cate_ids=np.unique(gt_box_array[:,-1]) for tmp_cateid in cate_ids: conf_matrix[tmp_cateid, ...
- SpringBoot笔记--Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.报错的解决
问题描述 写了SpringBoot代码之后,运行不出来结果,报出这样的一个错误:Failed to configure a DataSource: 'url' attribute is not spe ...
- 对使用网站模板编写自己的jsp页面的收获
收获与问题 先感叹一句模板的强大,模板只要按照我的上一篇博客的步骤进行修改,我们就能拥有一个自己写好看许多的界面了. 我目前套用模板还不是很熟练,套用的速度还需要加快,不过目前的我,已经掌握了基本要领 ...