-
2021-12-11 23:09:03更多相关内容
-
批输入物料基础数据长文本SAP
2014-05-16 16:26:56批输入物料基础数据长文本, SAP源程序 -
mysql 存储长文本
2021-03-04 00:53:35可以使用TEXT,BLOB俩种类型来存储长文本。1. TEXTTEXT有4有类型:TINYTEXT 256bytesTEXT 64kbMEDIUMTEXT 16MbLONGTEXT 4GB使用注解@Lob@Basic(fetch=FetchType.LAZY)@Column(columnDefinition="TEXT",n...在写项目时,需要把文章中的图文存储到mysql中数据库中,查了一下>可以使用TEXT,BLOB俩种类型来存储长文本。
1. TEXT
TEXT有4有类型:
TINYTEXT 256bytes
TEXT 64kb
MEDIUMTEXT 16Mb
LONGTEXT 4GB
使用注解
@Lob
@Basic(fetch=FetchType.LAZY)
@Column(columnDefinition="TEXT",nullable=true)
public String getContent() {
return Content;
}
2. BLOB
TINYBLOB
BLOB、
MEDIUMBLOB
LONGBLOB
blob 保存的是二进制数据,利用这个特性,可以把图片存储到数据库里面。text只能存储文本。
使用注解
@Lob
@Basic(fetch=FetchType.LAZY)
@Column(columnDefinition="BLOB",nullable=true)
public String getContent() {
return Content;
}
1. 我使用的是text的,因为blob存储的是二进制格式,所以长文本里面的搜有数据都是二进制数据,在上传图文的时候,传过来是String,保存起来,读取都需要转换,还有javaBean设计的时候也要把文本的类型弄成BLOB类型,在加上hibernate 4 ,生成blob对象还要LobHelper,各种麻烦,于是就使用text来存储。
2 . 那么如何存储文章中的图片呢,我的处理是把文字与图片的地址都存储成text类型,使用特定的标签把图片地址包起来,然后在解析的时候,使用正则表达式把图片拿出来,在去服务器去访问。
3. 当你把文章存进去之后,会发现使用 文章中包含 换行符 之后的文字都不见了,其实他里面的数据还是有的,为了方便我把换行符都换为了
-
基于BERT的超长文本分类模型
2020-04-11 23:00:29基于BERT的超长文本分类模型0.Abstract1.任务介绍数据集评估方法测试集 0.Abstract 本文实现了一个基于BERT+LSTM实现超长文本分类的模型, 评估方法使用准确率和F1 Score. 项目代码github地址: 1.任务介绍 用BERT做...基于BERT的超长文本分类模型
0.Abstract
本文实现了一个基于BERT+LSTM超长文本分类的模型, 评估方法使用准确率和F1 Score.
项目代码github地址: https://github.com/neesetifa/bert_classification1.任务介绍
用BERT做文本分类是一个比较常见的项目.
但是众所周知BERT对于文本输入长度有限制. 对于超长文本的处理, 最简单暴力无脑高效的办法是直接截断, 就取开头这部分送入BERT. 但是也请别看不起这种做法, 往往最简单,最Naive的方法效果反而比一顿操作猛如虎复杂模型来得好.这里多提一句为什么. 通常长文本的文章结构都比较明确, 文章前面一两段基本都是对于后面的概述. 所以等于作者已经帮你提取了文章大意, 所以直接取前面一部分理论上来说是有意义的.
当然也有最新研究表明取文章中间部分效果也很不错. 在此不展开.本文实现的是一种基于HIERARCHICAL(级联)思想的做法, 把文本切成多片处理. 该方法来自于这篇论文 <Hierarchical Transformers for Long Document Classification>.
文中提到这么做还能降低self-attention计算的时间复杂度.
假设原句子长为n, 每个分段的长度是k. 我们知道最原始的BERT计算时间复杂度是O(n2), 作者认为,这么做可以把时间复杂度降低到O(nk). 因为我们把n分数据分割成k小份, 那么我们一共要做n/k次, 每次我们的时间复杂度是k2, 即O(n/k * k2) = O(nk)数据集
这次我们测试该模型在两种语言上的效果. 分别是中文数据集和英语数据集.
中文数据集依旧是我们的老朋友ChineseNLPCorps提供的不同类别商品的评论.
中文数据集传送门
英语数据集来源于Kaggle比赛, 用户对于不同金融产品的评论.
英语数据集传送门
由于两种数据集训练预测上没有什么本质区别, 下文会用英语数据集来演示.评估方法
本项目使用的评估方法是准确率和F1 Score. 非常常见的分类问题评价标准.
测试集
此项目中直接取了数据集里一小部分作为测试集.
2.数据初步处理
数据集里有55W条数据,18个features.
我们需要的部分是product(即商品类别)以及consumer complaint narrative.
观察数据集,我们发现用户评论是有NaN值的. 而且本次实验目的是做超长文本分类. 我们选取非NaN值,并且是长度大于250的评论.
筛选完后我们保留大约17k条左右数据
3.Baseline模型
我们先来看一下什么都不做, 直接用BERT进行finetune能达到什么样的效果. 我们以此作为实验的baseline.
本次预训练模型使用google官方的BERT-base-cased英语预训练模型(当然用uncased应该也没关系, 我没有测试)
fine-tune部分很简单, 直接提取[CLS] token后过线性层, 是比较常规的套路. 损失函数使用cross entropy loss.
文本送入的最大长度定为250. 即前文里提到的"直接截取文本前面部分". 此次实验里我们尝试比较HIERARCHICAL方法能比直接截取提高多少.
如图, 准确率达到了88%. 训练数据不过10k的数量级, 对于深度学习来说是非常少的. 这里不得不感叹下BERT作为预训练模型在小样本数据上的实力非常强劲.4. 数据进一步处理
接下来我们进入提高部分. 首先对数据进一步处理.
分割文本
HIERARCHICAL思想本质是对数据进行有重叠(overlap)的分割. 这样分割后的每句句子之间仍然保留了一定的关联信息.
众所周知,BERT输入的最大长度限制为512, 其中还需要包括[CLS]和[SEP]. 那么实际可用的长度仅为510. 但是别忘了, 每个单词tokenizer之后也有可能被分成好几部分. 所以实际可输入的句子长度远不足510.
本次实验里我们设置分割的长度为200, overlap长度为50. 如果实际上线生产确有大量超过500长度的文本, 只需将分割和overlap长度设置更长即可.def get_split_text(text, split_len=250, overlap_len=50): split_text=[] for w in range(len(text)//split_len): if w == 0: #第一次,直接分割长度放进去 text_piece = text[:split_len] else: # 否则, 按照(分割长度-overlap)往后走 window = split_len - overlap_len text_piece = [w * window: w * window + split_len] split_text.append(text_piece) return split_text
分割完后长这样
随后我们将这些分割的句子分离成单独的一条数据. 并为他们加上label.
对比原文本可以发现, index 1~ index4来源于同一句句子. 它被分割成了4份并且每份都拥有原文本的label.4.最终模型
最终模型由两个部分构成, 第一部分是和baseline里一模一样的, fine-tune后的BERT. 第二部分是由LSTM+FC层组成的混合模型.
即实际上, BERT只是用来提取出句子的表示, 而真正在做分类的是LSTM + FC部分(更准确来说是FC部分, 因为LSTM模型部分仍然在做进一步的特征提取工作)
这里稍微提一句,这样做法我个人认为类似于广告推荐系统里GBDT+LR的组合. 采用一个稍微复杂的模型去做特征提取, 然后用一个相对简单的模型去预测.第一部分: BERT
首先,我们把分割好后的文本送入BERT进行训练. 这边我跑了5个epoch, 显卡仍然是Tesla K80, 每个epoch大约需要23分钟左右.
接着, 我们提取出这些文本的句子表示.
方便起见, 我们这里仍然用[CLS] token作为句子表示. 当然也可以用sequence_output(在我上一个项目FAQ问答的最后结论中, 使用sequence_output的确能比pooled_output效果更好一点)
我们获得的是这样一组数据:句子1_a的embedding, label
句子1_b的embedding, label
句子1_c的embedding, label
句子2_a的embedding, label
句子2_b的embedding, label
句子3_a的embedding, label
…随后我们把这些embedding拼回起来, 变成了
[句子1_a的embedding,句子1_b的embedding, 句子1_c的embedding], label
[句子2_a的embedding, 句子2_b的embedding], label
[句子3_a的embedding, 句子3_b的embedding], label这部分数据将作为LSTM部分的输入.
第二部分: LSTM + FC
这一步,我们将上一步得到的embedding直接送入LSTM网络训练.
回想一下, 我们平时用LSTM做, 是不是把句子过了embedding层之后再送入LSTM的? 这里我们直接跳过embedding层, 因为我们的数据本身就是embedding
由于分割后的embedding都不会太长, 我们直接使用LSTM最后一个time step的输出(当然这里也有个尝试点, 如果提取出LSTM每个time step的输出效果是不是会更好?)
LSTM之后会过一个激活函数, 接一个FC层, FC层和label用cross entropy loss进行优化.
由于合并后的数据量比较小, 我跑了10个epoch, 每次都很快.
最终效果和一些小节
(左边loss, 右边accuracy)
最终效果居然提高到了94%!! 说实话这个提升量远高于论文. 可能和数据本身好也有关系. 但是我们可以认为, 比起直接截取文本开头一段, 采用HIERARCHICAL方式不仅克服了BERT长度限制的缺点, 也极大提升了对于超长文本的分类效果.下面是在中文数据集上模型的baseline效果和提升后的效果.
(待跑)所以我认为, 采用HIERARCHICAL方法, 提升/解决了BERT两方面的缺点:
1.降低了BERT里self-attention部分计算的时间复杂度. 就如开头所说, 时间复杂度从O(n2)降低到O(nk). 这个情况尤其适用于长度在500以内长度的文本.
2.克服了BERT对于输入文本长度有限的缺点. 对于tokenize之后长度超过510的文本, 也可以用此方式对准确率进行再提升, 其实际效果优于直接截断文本.5. 进一步拓展: BERT + Transformer
原论文里还提到了使用Transformer代替LSTM作为预测部分.
这一节我们用Transformer来试一下.
我们先来分析一下使用Transformer结构后的时间复杂度. 显然它的时间复杂度和LSTM不一样(LSTM复杂度我们可以认为是线性的, 即O(n/k)~O(n).)
首先在BERT部分, 时间复杂度不变, 依旧为为O(n/k * k2) = O(nk). 进入到Transformer后,每个sequence长度为n/k, 所以时间复杂度为O(n/k * n/k)=O(n2/k2).
那么总体时间复杂度为 O(nk) + O(n2/k2) ~ O(n2/k2).
相比于LSTM的O(nk), 这个O(n2/k2)复杂度是有相当的上升的. 但是我们考虑到 n/k << n, 即n/k的量级远小于n, 所以还是在可接受的范围.
(本小节未完…) -
MySQL长文本存储类型
2021-01-18 18:44:16可以使用TEXT,BLOB俩种类型来存储长文本。1. TEXTTEXT有4有类型:TINYTEXT 256bytesTEXT 64kbMEDIUMTEXT 16MbLONGTEXT 4GB2. BLOBTINYBLOBBLOB、MEDIUMBLOBLONGBLOBblob 保存的是二进制数据,利用这个特性,可以把...可以使用TEXT,BLOB俩种类型来存储长文本。
1. TEXT
TEXT有4有类型:
TINYTEXT 256bytes
TEXT 64kb
MEDIUMTEXT 16Mb
LONGTEXT 4GB
2. BLOB
TINYBLOB
BLOB、
MEDIUMBLOB
LONGBLOB
blob 保存的是二进制数据,利用这个特性,可以把图片存储到数据库里面。text只能存储文本。
长使用的是text的,因为blob存储的是二进制格式,所以长文本里面的搜有数据都是二进制数据,在上传图文的时候,传过来是String,保存起来,读取都需要转换,还有javaBean设计的时候也要把文本的类型弄成BLOB类型,在加上hibernate 4 ,生成blob对象还要LobHelper,各种麻烦,于是就使用text来存储。
如何存储图片??
答:把文字与图片的地址都存储成text类型,使用特定的标签把图片地址包起来,然后在解析的时候,使用正则表达式把图片拿出来,在去服务器去访问。
-
ABAP 显示长文本
2018-05-30 09:23:18业务背景:目前项目上 采购订单打印输出EXCEL的需求:允许客户进行长文本编辑、更改后保存到采购订单抬头,并且打印输出到EXCEL,且下次进入到相同的采购订单打印时,能取出相应的长文本进行excel输出。一般来讲,... -
Bert 如何解决长文本问题?
2020-02-19 10:03:55举例: 在阅读理解问题中,...因为Test之时不需要Back Propagation,亦不需要large batchsize,因而总有手段将长文本塞进显存中(如torch.no grad, batch size=1)。 至于具体实现可以参考原始BERT的run_squad: ... -
超长文本,用什么数据库储存?
2021-01-31 07:30:45条目五:其它数据库产品MySQL,关系数据库,强在事务和关联查询 Redis/Memcache,内存数据库,主要用作缓存,不适用于长文本处理 ElasticSearch,全文搜索,虽然楼主没提,但在笔记类产品的确有这种需求。... -
长文本分类的总结
2018-08-28 08:43:17笨妞很少做文本分类,因为工作中文本分类确实不怎么用得到,唯一一个项目用到短文本分类,验证集acc和f1都到90%以上,所以在笨妞印象中文本分类应该是很简单的分类问题,都不属于NLP问题。偶然碰到DC竞赛中“达观杯... -
pyqt5 长文本滚动展示
2020-06-29 17:32:29pyqt5 长文本滚动展示 在写qt版的客户端时, 需要开发一个公告的功能, 公告内容过长需要滚动显示 尝试了许多方式, 优化了一下还是可以的, 这里写几个demo记录一下 使用的开发语言和技术 Python3 + PyQt5 这是一... -
css 长文本及长链接自动换行的几种方法
2021-06-10 10:15:32方法一:你定死表格的...nowrap强制在同一行内显示所有文本,直到文本结束或者遭遇 br 对象white-space:nowrap; }方法三:自动换行div{ word-wrap: break-word;//word-break设置强行换行;normal 亚洲语言和非亚洲... -
oracle存储超长文本
2020-03-24 10:54:23LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。 而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于... -
ABAP长文本
2016-10-31 10:12:18长文本存储在表格:STXH(抬头),STXL(行项目)中。 长文本中有四个关键属性: object、id、name、langguge 即: TDOBJECT TDNAME TDID TDSPRAS 其中language不必解释,object ... -
mysql存入长文本
2019-08-27 12:33:13进入mysql DOS命令窗口下mysql -u xx -p 进入数据库 查看max_allowed_packet最大允许值 mysql下输入show VARIABLES like ‘%max_allowed_packet%’; 这里max_allowed_packet只有1M,显然很小 ... -
一种解决bert长文本匹配的方法
2019-11-05 21:39:18我们的原始的微调数据是查询query和长文本document的关系,而我们将长文本拆分为n个短句子后,不是所有的句子和当前的query是强相关的(正样本),因此我们不能简单依赖现在的长文本数据了。本论文的解决方法是基于... -
python 基于LDA算法的长文本主题提取分类并预测类别
2020-04-26 11:53:07python 基于LDA长文本主题提取并预测分类 Lda算法原理,知乎上有很完善的算法介绍,这里就不多废话了。 数据准备 这一阶段主要是对你的问题本进行处理,清洗你的数据。中文文本预处理,主要包括去空格、去表单符号、... -
SAP ABAP物料使用SAVE_TEXT写入长文本
2020-09-08 11:38:21基本数据文本中的长文本写入 DATA:ls_theaderTYPEthead,"长文本的head lt_linesTYPETABLEOFtline, ls_linesTYPEtline. ls_theader-tdobject='MATERIAL'."固定值 ls_theader-tdname=ls_head-... -
sql存储长文本
2018-06-30 11:34:00Text: TINYTEXT 256bytes TEXT 64kb MEDIUMTEXT 16Mb LONGTEXT 4GB 转载于:https://www.cnblogs.com/maoriaty/p/9246552.html -
ABAP读取长文本的方法
2017-10-09 14:24:50SAP中所有的项目文本都存在以下两张数据表中: ...长文本读取方法 首先在STXH和STXL中根据OBJECT NAME, TEXT ID,TEXT OBJECT查找到需要的文本对象, 然后通过READ_TEXT / READ_TEXT_INLINE函数来读取文本内容。 -
mysql和oracle分别用什么类型储存长文本
2020-03-17 10:27:20首先是oracle: clob类型,但对于这个类型处理起来还是比较麻烦的,varchar2长度为4000bytes,如果varchar2能满足楼主的需求,建议使用varchar2; 然后是mysql: ①、TEXT TEXT有4有类型: 1、...text只能存储文本。 -
DMDB -- 使用达梦数据库管理端导出 TEXT 类型的数据,无法显示内容,只显示‘「长文本」
2020-07-08 20:12:03正常情况下,我们将数据从达梦数据库中导出...长文本>',而不会显示在数据库中存储的实际内容 想要避免这种情况,针对含有 TEXT 字段的表格,我们可以使用 DM 数据迁移工具 DM数据迁移工具 新建工程 -> 新建迁移 -
2018年"达观杯"文本智能处理挑战赛-长文本分类-rank4解决方案
2018-12-16 11:51:52此次比赛,达观数据提供了一批长文本数据和分类信息,希望选手动用自己的智慧,结合当下最先进的NLP和人工智能技术,深入分析文本内在结构和语义信息,构建文本分类模型,实现精准分类。未来文本自动化处理的技术... -
基于TF-IDF+语义相似度的长文本相似度计算
2019-04-21 17:21:01文本预处理:分词 训练词向量 tf-idf提取关键词并写入文档 前20个词 word2vec读取提取的关键词并转为词向量 相似度计算。 前面对word2vec的理论进行了介绍,接下来进入实战环节。实践主要分为三部分,word2vec... -
vue超长文本使用省略号展示,中英文数字通用
2019-11-04 21:15:28如果希望超长文本只展示一行: width: 200px; display: block; text-overflow: ellipsis; /*超出内容用省略号*/ overflow: hidden; /*内容超出后隐藏*/ white-space: nowrap; /*文本不进行换行*/ 如果希望超长... -
物料主数据长文本取值
2018-09-12 10:08:05 -
JavaScript使用RSA进行超长文本加解密
2018-08-10 10:02:03是通过用jsencrypt.min.js来实现的,此js文件实现了对超长文本字段加密功能。写这个文件的大师很牛!膜拜一下�� RSA加密方法: var encrypt = new JSEncrypt(); encrypt.setPublicKey("-----BEGIN ... -
SAP ABAP编程 获取物料长文本-其他长文本同理
2016-04-30 16:39:35获取物料长文本 FORM FORM_GTT_LONGTXT USING ZMATNR ”物料号 CHANGING LONGTXT. "长文本 DATA: LV_RETURN TYPE TABLE OF TLINE WITH HEADER LINE. CALL FUNCTION 'READ_TE -
spring boot data jpa 创建表中长文本字段
2019-01-25 11:29:49spring boot data jpa 创建表中长文本字段 1.如何创建 需要用到的注解 @Lob @Lob标注表示将属性映射成数据库支持的大对象类型,Clob或者Blog。其中: Clob(Character Large Ojects)类型是长字符...