在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上有资源)将停用词删掉可以有效帮助训练,因为停用词没有意义;或者使用下采样方法,将高频率词按一定概率删除,频率越高,则被删除概率越高,通常使用如下的概率公式:

\[P(w_i) = max(1-\sqrt{\frac{t}{f(w_i)}}, 0)
\]

即单词\(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数据预处理:词库、词典与语料库的更多相关文章

  1. Python的工具包[1] -> pandas数据预处理 -> pandas 库及使用总结

    pandas数据预处理 / pandas data pre-processing 目录 关于 pandas pandas 库 pandas 基本操作 pandas 计算 pandas 的 Series ...

  2. 第一章:AI人工智能 の 数据预处理编程实战 Numpy, Pandas, Matplotlib, Scikit-Learn

    本课主题 数据中 Independent 变量和 Dependent 变量 Python 数据预处理的三大神器:Numpy.Pandas.Matplotlib Scikit-Learn 的机器学习实战 ...

  3. 【自定义IK词典】Elasticsearch之中文分词器插件es-ik的自定义词库

    Elasticsearch之中文分词器插件es-ik 针对一些特殊的词语在分词的时候也需要能够识别 有人会问,那么,例如: 如果我想根据自己的本家姓氏来查询,如zhouls,姓氏“周”.      如 ...

  4. Python: sklearn库——数据预处理

    Python: sklearn库 —— 数据预处理 数据集转换之预处理数据:      将输入的数据转化成机器学习算法可以使用的数据.包含特征提取和标准化.      原因:数据集的标准化(服从均值为 ...

  5. Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别

    敲<Python机器学习及实践>上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下: ...

  6. Python数据预处理:机器学习、人工智能通用技术(1)

    Python数据预处理:机器学习.人工智能通用技术 白宁超  2018年12月24日17:28:26 摘要:大数据技术与我们日常生活越来越紧密,要做大数据,首要解决数据问题.原始数据存在大量不完整.不 ...

  7. 【中文同义词近义词】词向量 vs 同义词近义词库

    方案一:利用预训练好的词向量模型 优点: (1)能把词进行语义上的向量化(2)能得到词与词的相似度 缺点: (1)词向量的效果和语料库的大小和质量有较大的关系(2)用most_similar() 得到 ...

  8. 【新人赛】阿里云恶意程序检测 -- 实践记录10.20 - 数据预处理 / 训练数据分析 / TF-IDF模型调参

    Colab连接与数据预处理 Colab连接方法见上一篇博客 数据预处理: import pandas as pd import pickle import numpy as np # 训练数据和测试数 ...

  9. 斯坦福NLP课程 | 第1讲 - NLP介绍与词向量初步

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  10. Sphinx(coreseek) 安装使用以及词库的扩展

    1.Sphinx(coreseek) 是啥 一般而言,Sphinx是一个独立的全文搜索引擎:而Coreseek是一个支持中文的全文搜索引擎,意图为其他应用提供高速.低空间占用.高结果相关度的中文全文搜 ...

随机推荐

  1. File类----> FileFilter接口:实现方法

    1创建一个类 继承 FileFilter接口 在类中重写boolean accept方法 写出要实现的条件2在main方法中创建File对象 代表了D盘File file = new File(&qu ...

  2. c语言中的链表

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 链表(单向链表的建立.删除.插入.打印) 1.链表一般分为: 单向链表 双 ...

  3. Centos8 防火墙

    Centos8 防火墙 一: 防火墙端口相关操作 1:查看防火墙某个端口是否开放 firewall-cmd --query-port=3306/tcp 2:开放防火墙端口 注意:开放端口后要重启防火墙 ...

  4. mssql实现Split

    create function Fun_Split( @SourceSql varchar ( 8000 ), @StrSeprate varchar ( 10 )) returns @temp ta ...

  5. []Python][simple]Serialize data with Pickle and deserialize data from pickle

    序列化 import pickle friend = {"Dan": [20, "Lodon", 123123], "Mary" : [24 ...

  6. python学习记录(三)-数据类型

    字符串格式化 var = 'abcde' # 切片 print(var[2],var[-1]) # c e print(var[1:3:1],var[-2:-5:-1],var[::-1]) # bc ...

  7. restfull风格传参

  8. angularJS依赖注入的个人理解

    依赖注入:一句话 --- 没事你不要来找我,有事我会去找你. AngularJS    5个核心组件用来作为依赖注入: value factory service provider constant ...

  9. Neo4j学习(2)--简单入门

    1.Neo4j属性图数据模型 节点:包含多个属性和标签.一个节点就是一条数据 属性:键值对形式 关系:单向与双向,连接节点,也可包含多个属性和标签 标签:表示节点和关系的类型,可以有多个,同时可以通过 ...

  10. 《MySQL是怎样运行的》第七章小结