nlp文本预处理构建词汇表
文本预处理:
建立字典,将每个词或者字映射到一个唯一的索引(index)
将文本从词或者字的序列转换为索引的序列,方便输入模型
并且label同步映射
import jsonfrom ner import loggerclass Vocab(object):"""构建字或词及其id的映射、构建label及其id的映射"""def __init__(self, vocab2id=None, id2vocab=None, tag2id=None, id2tag=None,unk_vocab_id=0, pad_vocab_id=1, pad_tag_id=0):self.vocab2id = vocab2idself.id2vocab = id2vocabself.tag2id = tag2idself.id2tag = id2tagself.vocab_size = 0 if not vocab2id else len(vocab2id)self.label_size = 0 if not tag2id else len(tag2id)self.unk_vocab_id = unk_vocab_idself.pad_vocab_id = pad_vocab_idself.pad_tag_id = pad_tag_iddef build_vocab(self, texts=None, labels=None, build_texts=True, build_labels=True, with_build_in_tag_id=True):"""构建词汇表"""logger.info('start to build vocab ...')if build_texts:assert texts, 'Please make sure texts is not None!'self.vocab2id, self.id2vocab = {'<UKN>': self.unk_vocab_id, '<PAD>': self.pad_vocab_id}, \{self.unk_vocab_id: '<UKN>', self.pad_vocab_id: '<PAD>'}vocab_cnt = 2for text in texts:for seg in text:if seg in self.vocab2id:continueself.vocab2id[seg] = vocab_cntself.id2vocab[vocab_cnt] = segvocab_cnt += 1self.vocab_size = len(self.vocab2id)if build_labels:assert labels, 'Please make sure labels is not None!'self.tag2id, self.id2tag = {'<PAD>': self.pad_tag_id}, {self.pad_tag_id: '<PAD>'}tag_cnt = 1if not with_build_in_tag_id: # label不预置PAD_IDself.tag2id, self.id2tag = {}, {}tag_cnt = 0for label in labels:for each_label in label:if each_label in self.tag2id:continueself.tag2id[each_label] = tag_cntself.id2tag[tag_cnt] = each_labeltag_cnt += 1self.label_size = len(self.tag2id)logger.info('build vocab finish, vocab_size: {}, label_size: {}'.format(self.vocab_size, self.label_size))def save_vocab(self, vocab_file):"""保存词汇表"""result = {'vocab2id': self.vocab2id,'id2vocab': self.id2vocab,'tag2id': self.tag2id,'id2tag': self.id2tag}with open(vocab_file, 'w', encoding='utf-8') as f:f.write(json.dumps(result, ensure_ascii=False, indent=4))logger.info('save vocab to {}'.format(vocab_file))def load_vocab(self, vocab_file):"""加载词汇表"""with open(vocab_file, 'r', encoding='utf-8') as f:result = json.loads(f.read())self.vocab2id = result['vocab2id']self.id2vocab = {int(k): v for k, v in result['id2vocab'].items()} # 将id转为intself.tag2id = result['tag2id']self.id2tag = {int(k): v for k, v in result['id2tag'].items()}self.vocab_size = len(self.vocab2id)self.label_size = len(self.tag2id)"""当使用预训练的模型或Embedding时,可能使用别人的vocab,下面set方法允许设置外部的vocab"""def set_vocab2id(self, vocab2id):self.vocab2id = vocab2idself.vocab_size = len(self.vocab2id)return selfdef set_id2vocab(self, id2vocab):self.id2vocab = id2vocabreturn selfdef set_tag2id(self, tag2id):self.tag2id = tag2idself.label_size = len(self.tag2id)return selfdef set_id2tag(self, id2tag):self.id2tag = id2tagreturn selfdef set_unk_vocab_id(self, unk_vocab_id):self.unk_vocab_id = unk_vocab_iddef set_pad_vocab_id(self, pad_vocab_id):self.pad_vocab_id = pad_vocab_iddef set_pad_tag_id(self, pad_tag_id):self.pad_tag_id = pad_tag_id
nlp文本预处理构建词汇表相关推荐
- python 词汇表_使用Counter构建词汇表
这里只记录两种情况: 1 数据集是一段连续的文本,所有词汇放在一个list中(一维的) text: 此时Counter(text),text可以是一个list,统计该list中所有元素出现的次数并返回 ...
- NLP文本预处理:步骤、示例 | 附github源码
点击关注我哦 一篇文章带你了解NLP文本预处理:步骤.示例 | 附github源码 注:关注[小白玩转Python]公众号,后台回复[NLP文本预处理],可以获取完整源码以及项目所需数据集. 文本数据 ...
- NLP自然语言处理实战(一):利用分词器构建词汇表
在NLP中,分词(tokenization,也称分词)是一种特殊的文档切分(segmentation)过程.而文档切分能够将文本拆分成更小的文本块或片段,其中含有更集中的信息内容.文档切分可以是将文档 ...
- NLP —— 文本预处理
一.分词简介 分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字.句和段能通过明显的分界符来简单划界,唯独词没有一个形 ...
- NLP | 文本预处理
一.文本预处理 作用:文本语料在输送给模型前一般需要一系列的预处理工作,才能符合模型输入的要求,如:将文本转化成模型需要的张量,规范张量的尺寸等,而且科学的文本预处理环节还将有效指导模型超参数的选择, ...
- NLP文本预处理去除标点符号
from string import punctuation import re import sys reload(sys) sys.setdefaultencoding('utf-8')impor ...
- 【特征工程】词袋模型/TF-IDF模型/词汇表模型的代码实现(文本特征提取)
文章目录 1.词袋模型 2.TF-IDF模型 3.词汇表模型 1.词袋模型 词集模型:单词构成的集合,集合中仅统计单词的有无,不统计具体单词的出现的次数 词袋模型:在词集模型的基础上,统计单词出现的次 ...
- 第六课.NLP文本分类任务
第六课目录 NLP文本分类简介 IMDB数据集准备 设置随机种子 下载IMDB并划分数据集 构建词汇表 使用torchtext生成batch WordAveraging 模型定义 加载由glove.6 ...
- 文本预处理方法_生产中的自然语言处理27种快速文本预处理方法
文本预处理方法 大纲(Outline) Estimates state that 70%–85% of the world's data is text (unstructured data) [1] ...
最新文章
- 你应该知道的15个Silverlight诀窍
- .NET分布式缓存Memcached测试体验
- rstudio怎么安装ggplot2_如何基于ggplot2构建相关系数矩阵热图
- TI BLE协议栈 按键流程分析
- mysql hypot_mysqli_stmt_prepare
- HDU 5919 Sequence II 主席树
- 使用 ipmitool 实现远程管理Dell 系列服务器
- 每日一题(53)—— 评价代码片段
- MySQL 的 IFNULL()、ISNULL() 、 NULLIF()、IF() 函数
- Java学习日报—消息队列—2021/11/23
- 安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
- Windows 发布本地提权0day,可以系统权限执行任意代码
- AngularJS控制器中的#39;this#39;与$ scope
- poj 3040 Allowance (贪心
- 阿里最新组织架构大轮岗,主要涉及HR线
- 计算机ppt密码是什么,PPT怎么设置密码 PPT密码设置教程-电脑教程
- 用spark统计50年美国最常见的20个名字
- 完整版JavaWeb环境搭建-maven-servlet...与测试,欢迎大家一起学习
- 直播间人气互动软件教程
- 如何编辑扫描的PDF文件?