文本预处理:

建立字典,将每个词或者字映射到一个唯一的索引(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文本预处理构建词汇表相关推荐

  1. python 词汇表_使用Counter构建词汇表

    这里只记录两种情况: 1 数据集是一段连续的文本,所有词汇放在一个list中(一维的) text: 此时Counter(text),text可以是一个list,统计该list中所有元素出现的次数并返回 ...

  2. NLP文本预处理:步骤、示例 | 附github源码

    点击关注我哦 一篇文章带你了解NLP文本预处理:步骤.示例 | 附github源码 注:关注[小白玩转Python]公众号,后台回复[NLP文本预处理],可以获取完整源码以及项目所需数据集. 文本数据 ...

  3. NLP自然语言处理实战(一):利用分词器构建词汇表

    在NLP中,分词(tokenization,也称分词)是一种特殊的文档切分(segmentation)过程.而文档切分能够将文本拆分成更小的文本块或片段,其中含有更集中的信息内容.文档切分可以是将文档 ...

  4. NLP —— 文本预处理

    一.分词简介 分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字.句和段能通过明显的分界符来简单划界,唯独词没有一个形 ...

  5. NLP | 文本预处理

    一.文本预处理 作用:文本语料在输送给模型前一般需要一系列的预处理工作,才能符合模型输入的要求,如:将文本转化成模型需要的张量,规范张量的尺寸等,而且科学的文本预处理环节还将有效指导模型超参数的选择, ...

  6. NLP文本预处理去除标点符号

    from string import punctuation import re import sys reload(sys) sys.setdefaultencoding('utf-8')impor ...

  7. 【特征工程】词袋模型/TF-IDF模型/词汇表模型的代码实现(文本特征提取)

    文章目录 1.词袋模型 2.TF-IDF模型 3.词汇表模型 1.词袋模型 词集模型:单词构成的集合,集合中仅统计单词的有无,不统计具体单词的出现的次数 词袋模型:在词集模型的基础上,统计单词出现的次 ...

  8. 第六课.NLP文本分类任务

    第六课目录 NLP文本分类简介 IMDB数据集准备 设置随机种子 下载IMDB并划分数据集 构建词汇表 使用torchtext生成batch WordAveraging 模型定义 加载由glove.6 ...

  9. 文本预处理方法_生产中的自然语言处理27种快速文本预处理方法

    文本预处理方法 大纲(Outline) Estimates state that 70%–85% of the world's data is text (unstructured data) [1] ...

最新文章

  1. 你应该知道的15个Silverlight诀窍
  2. .NET分布式缓存Memcached测试体验
  3. rstudio怎么安装ggplot2_如何基于ggplot2构建相关系数矩阵热图
  4. TI BLE协议栈 按键流程分析
  5. mysql hypot_mysqli_stmt_prepare
  6. HDU 5919 Sequence II 主席树
  7. 使用 ipmitool 实现远程管理Dell 系列服务器
  8. 每日一题(53)—— 评价代码片段
  9. MySQL 的 IFNULL()、ISNULL() 、 NULLIF()、IF() 函数
  10. Java学习日报—消息队列—2021/11/23
  11. 安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
  12. Windows 发布本地提权0day,可以系统权限执行任意代码
  13. AngularJS控制器中的#39;this#39;与$ scope
  14. poj 3040 Allowance (贪心
  15. 阿里最新组织架构大轮岗,主要涉及HR线
  16. 计算机ppt密码是什么,PPT怎么设置密码 PPT密码设置教程-电脑教程
  17. 用spark统计50年美国最常见的20个名字
  18. 完整版JavaWeb环境搭建-maven-servlet...与测试,欢迎大家一起学习
  19. 直播间人气互动软件教程
  20. 如何编辑扫描的PDF文件?

热门文章

  1. Mac下制作Linux Centos7启动盘
  2. 微信小程序实现长文本分段播放
  3. 小白必看——UG NX模具分模原理知识,如何确定分型面
  4. php时间正序排序,列表的时间排序,应该正序还是倒序?
  5. VIPKID前端面试题
  6. C++智能指针入门之unique_ptr
  7. 安卓开发——拍照、裁剪并保存为头像报错:裁剪图片无法保存的
  8. ”35岁没500万存款就是失败?“,35岁职场人真实存款流出!
  9. 出国旅游也能用微信买单了
  10. easyexcel一个很棒的Excel解析工具