Sunrise

`长路漫漫,唯剑作伴`


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

Word2Vec

发表于 2022-06-13 | 分类于 自然语言处理

Word2Vec

在自然语言发展的早期阶段,词的表示经历了不断地发展和改进,直到后来有一种word vector的思想被提出以及后续的实现,才极大地促进了NLP的发展。

word vector的核心思想:

为每个单词构建一个密集向量,选择后的向量与出现在类似上下文中的单词向量相似。

注:word vectors 也叫 word embeddings 或者 (neural) word representations,它们是分布式表示的。

这样的思想确实很好,可是如何实现是一个难点,实际上在2003年,Neural Probabilistic Language Model就实现了符合这种需求的词向量,不过它的本意是训练一个语言模型,词向量的生成只不过是一个附属物,并且鉴于此模型中只使用了有限的前文信息,并且计算量过大,在2013年 Mikolov等人提出一个改进模型,用于学习词向量的表示。该模型的核心技术包括以下几点 。

阅读全文 »

TextRank算法实践

发表于 2022-05-29 | 分类于 算法

TextRank算法实践

PageRank算法思想

TextRank算法的思想主要源于PageRank算法,PageRank算法主要用于给互联网网页排序,根据网页之间的跳转来构造一个初始权重矩阵(转移矩阵),默认每个网页质量都是1

阅读全文 »

BERT finetune

发表于 2022-05-18 | 分类于 自然语言处理

BERT finetune

本文代码部分参考github项目:
https://github.com/BSlience/search-engine-zerotohero/tree/main/public/bert_wwm_pretrain

项目概述

本文的主要内容是基于huggingface transformer的chinese-bert-wwm模型,在自己的语料集上进行finetune的整体步骤和代码实现。

关于chinese-bert-wwm:

https://huggingface.co/hfl/chinese-bert-wwm

https://github.com/ymcui/Chinese-BERT-wwm

主要步骤包括:预处理和训练两个部分

预处理(pre-processing)

  1. 下载chinese-bert-wwm模型的预训练词表(vocab.txt)、config.json和pytorch_model.bin;
  2. 读取自己的原始数据集(比如大量的文章、文本),做句子分割,然后保存成语料集;
  3. 根据自己的语料集进行分词(BERT是分割成单个字),并将自己语料集中相比原始的词表多的字(或者词)添加到原始词表中(就是一个扩充操作),然后就生成了自己的词表;

步骤1的下载地址:https://huggingface.co/hfl/chinese-bert-wwm/tree/main

如果生成的语料集比较大,为了后续加载方便可以存储至内存型的数据库中(比如Redis)

训练(train)

  1. 加载BertTokenizer,读取语料集,生成数据;
  2. 针对1中得到的数据,进行填充、截断和mask等操作,借助data collator类;
  3. 加载chinese-bert-wwm模型的预训练权重文件,基于当前数据开始训练(微调);
  4. 保存模型,测试效果。

关于data collator的实现可以查看我的上一篇文章whole word mask;

步骤3加载的预训练权重文件就是上述预处理步骤1下载的,不过要注意把config.json和pytorch_model.bin放在同一个目录下,然后加载这个目录即可。

阅读全文 »

Whole Word Masking (wwm)

发表于 2022-05-10 | 分类于 自然语言处理

Whole Word Masking (wwm)

本文代码部分参考github项目:
https://github.com/BSlience/search-engine-zerotohero/tree/main/public/bert_wwm_pretrain

Whole Word Masking (wwm),暂翻译为全词Mask或整词Mask,是谷歌在2019年5月31日发布的一项BERT的升级版本,主要更改了原预训练阶段的训练样本生成策略。我们先看下BERT原文的遮蔽语言模型。

BERT–遮蔽语言模型

在BERT之前,标准的条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地看到自己,为了训练深度双向表示,BERT采用了一种简单的方法,即随机遮蔽一定比例的输入标记,然后仅预测那些被遮蔽的标记,这一过程被称为遮蔽语言模型(MLM, masked language model),尽管在文献中它通常被称为完型填词任务。

在这种情况下,就像在标准语言模型中一样,与遮蔽标记相对应的最终隐藏向量被输入到与词汇表对应的输出 softmax 中(也就是要把被遮蔽的标记对应为词汇表中的一个词语)。在所有的实验中,BERT在每个序列中随机遮蔽 15% 的标记。

虽然这确实允许我们获得一个双向预训练模型,但这种方法有两个缺点。第一个缺点是,我们在预训练和微调之间造成了不匹配,因为 [MASK] 标记在微调期间从未出现过。为了缓和这种情况,我们并不总是用真的用 [MASK] 标记替换被选择的单词。而是,训练数据生成器随机选择 15% 的标记,例如,在my dog is hairy 这句话中,它选择 hairy。然后执行以下步骤:

  • 80% 的情况下:用 [MASK] 替换被选择的单词,例如,my dog is hairy → my dog is [MASK]
  • 10% 的情况下:用一个随机单词替换被选择的单词,例如,my dog is hairy → my dog is apple
  • 10% 的情况下:保持被选择的单词不变,例如,my dog is hairy → my dog is hairy。这样做的目
    的是使表示偏向于实际观察到的词。

Transformer 编码器不知道它将被要求预测哪些单词,或者哪些单词已经被随机单词替换,因此它被迫保持每个输入标记的分布的上下文表示。另外,因为随机替换只发生在 1.5% 的标记(即,15% 的10%)这似乎不会损害模型的语言理解能力。

第二个缺点是,使用 Transformer 的每批次数据中只有 15% 的标记被预测,这意味着模型可能需要更多的预训练步骤来收敛。在 5.3 节中,我们证明了 Transformer 确实比从左到右的模型(预测每个标记)稍微慢一点,但是 Transformer 模型的实验效果远远超过了它增加的预训练模型的成本。

阅读全文 »

利用huggingface-transformers进行命名实体识别

发表于 2022-04-29 | 分类于 自然语言处理

利用huggingface-transformers进行命名实体识别

项目地址:https://github.com/huggingface/transformers

文档地址:https://huggingface.co/docs/transformers/pipeline_tutorial

寻找你要的模型

Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。

从这里:https://huggingface.co/models 可以查找你要的模型,可以根据任务、语言、框架、数据集等筛选。

这里我们想要进行基于中文的ner任务,筛选出这个模型: bert-base-chinese-ner

打开之后,通过介绍我们发现这是一个基于繁体中文的模型,对应的github地址是:

https://github.com/ckiplab/ckip-transformers

有需要的小伙伴可以尝试。

我们继续筛选,找到了这个模型:uer/roberta-base-finetuned-cluener2020-chinese

模型使用

阅读全文 »

使用HanLP进行分词和实体抽取

发表于 2022-04-23 | 分类于 自然语言处理

使用HanLP进行分词和实体抽取

HanLP Github地址:https://github.com/hankcs/HanLP

HanLP文档地址:https://hanlp.hankcs.com/docs/api/hanlp/pretrained/index.html

多任务模型

首先我们来了解下HanLP有哪些预训练模型,其分为单任务模型和多任务模型,多任务模型就是可以同时执行多个任务,其模型的位置都在hanlp.pretrained.mtl这个包下,根据其文档说明

hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_BASE_ZH

Electra(Clark et al.2020)在近源中文语料库上训练的联合tok、pos、ner、srl、dep、sdp和con模型的基础版本。

hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH

Electra(Clark et al.2020)在近源中文语料库上训练的联合tok、pos、ner、srl、dep、sdp和con模型的迷你版本。

hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ERNIE_GRAM_ZH

ERNIE(Xiao et al.2021)在近源汉语语料库上训练的联合tok、pos、ner、srl、dep、sdp和con模型的基础版本。

hanlp.pretrained.mtl.NPCMJ_UD_KYOTO_TOK_POS_CON_BERT_BASE_CHAR_JA

BERT(Devlin et al.2019)在NPCMJ/UD/Kyoto语料库上训练基本字符编码器,解码器包括tok、pos、ner、dep、con、srl。

hanlp.pretrained.mtl.OPEN_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_BASE_ZH

Electra(Clark et al.2020)在开源中文语料库上训练的联合tok、pos、ner、srl、dep、sdp和con模型的基础版本。

hanlp.pretrained.mtl.OPEN_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH

Electra(Clark et al.2020)在开源中文语料库上训练的联合tok、pos、ner、srl、dep、sdp和con模型的迷你版本。

hanlp.pretrained.mtl.UD_ONTONOTES_TOK_POS_LEM_FEA_NER_SRL_DEP_SDP_CON_XLMR_BASE

XLM-R(Conneau et al.2020)联合tok、pos、lem、fea、ner、srl、dep、sdp和con模型的基础版本,在UD和OntoNotes5语料库上进行训练。

hanlp.pretrained.mtl.UD_ONTONOTES_TOK_POS_LEM_FEA_NER_SRL_DEP_SDP_CON_MT5_SMALL

mT5(Xue et al.2021)联合tok、pos、lem、fea、ner、srl、dep、sdp和con模型的迷你版本,在UD和OntoNotes5语料库上进行训练。

阅读全文 »

Linux OOM机制

发表于 2022-04-03 | 分类于 Linux

记录一次程序总是异常中止的解决过程

问题描述:

开发的爬虫脚本在服务器上99%的时间都可以正常运行,但是偶尔会自动中止,进程消失。频率不固定,有的时候一天一次,有的时候一周一次,甚至很久不报错。后来解决该问题后,发现其实就是因为触发了某些条件才会出现异常,所以并不是有规律可言的。

解决过程

前面的这些解决过程不是很重要,实际是Linux系统的OOM机制导致程序被杀,不过遇到问题一般很难一开始就精准的定位到问题,都是一步步的推测问题产生的原因,然后不断地排除,直至问题的解决。所以前面这些步骤仅是在问题解决时的一些尝试性思路。

阅读全文 »

反爬(八)

发表于 2022-03-12 | 分类于 爬虫

反爬八

网站介绍

本次破解目标网站,该网站是一个搜索式的网站,支持模糊搜索,我们输入“公司”进行搜索,发现有滑动验证码。

分析其网络请求,我们可以看到这样几个关键请求:

获取验证码的请求:https://neris.csrc.gov.cn/shixinchaxun/sxcx/captcha/get(实际为一个POST请求)

post参数

1
2
3
captchaType: "blockPuzzle"
clientUid: "slider-d063f7fa-f53c-4868-8fed-12d68cfe932b"
ts: 1647072841626

请求返回json数据,内容如下

阅读全文 »

Python sm4加解密

发表于 2022-01-27 | 分类于 python编程

安装模块gmssl,pip install gmssl

阅读全文 »

CRNN项目实践

发表于 2022-01-09 | 分类于 深度学习

CRNN项目实战

之前写过一篇文章利用CRNN进行文字识别,当时重点讲的CRNN网络结构和CNN部分的代码实现,因为缺少文字数据集没有进行真正的训练,这次正好有一批不定长的字符验证码,正好CRNN主要就是用于端到端地对不定长的文本序列进行识别,当然是字符和文字都是可以用的,所以这里进行了一次实战。

主要是参考github项目:https://github.com/meijieru/crnn.pytorch

关于lmdb

lmdb安装

首先关于lmdb这个数据库,python有两个包,一个是lmdb,另一个是python-lmdb。

使用pycharm的包安装功能可以看到关于lmdb的描述

Universal Python binding for the LMDB 'Lightning' Database Version 1.3.0

关于python-lmdb的描述

simple lmdb bindings written using ctypes Version 1.0.0

所以理论上我们安装前者肯定是可以用的,但是经过亲身实践,

在pip环境中使用pip install lmdb确实可以正常使用;

但是在conda环境中,使用conda install lmdb安装完成之后却无法导入包。

所以又使用:conda install python-lmdb安装,安装完之后却可以使用,非常奇怪。

后发现原因大概率是版本问题,使用pip可以安装lmdb=1.3.0的最新版本,而conda只能安装lmdb=0.9.x的版本,所以目前在conda中只能使用python-lmdb暂替使用。

制作适用CRNN的lmdb数据集

github项目中关于如何训练自己的数据集写的不是很清楚,如果我们直接运行train.py会遇到各种问题,首先第一个问题就是数据集的问题,lmdbDataset中的初始化

阅读全文 »
1…456…12
chenxi

chenxi

116 日志
11 分类
213 标签
Links
  • Docle
  • Swift
© 2025 chenxi
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4