百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

用TensorFlow构建一个中文分词模型需要几个步骤

toyiye 2024-06-21 12:05 15 浏览 0 评论

分析

中文分词方法现在主要有两种类型,一种是jieba这样软件包中用隐马尔科夫(HMM)模型构建的。

另一种就是使用如TensorFlow、PyTorch这类训练深度学习序列标注(Tagging)模型。

这里面我们主要以后者为参考。

中文分词往往有两个直接目标,一个是把词汇分开,另一个给每个词以词性,例如动词、名词,或者更细分的地点名词、机构名词等等。

如果只是分词,是中文分词任务(SEG,Chinese Segmentation),如果需要词性,也可以被称为词性标注任务(POS,Part os Speech)任务。

这两个任务都可以通过深度学习的序列标注(Tagging)模型实现,当然也可以通过其他模型实现,在文章末尾会提及其他方法。

序列标注是一个将输入序列,标注为另一个符号序列的任务,例如我们定义每个词的开头符号是B,非开头符号是I。

那么分词一句话如:"中文的分词任务",就可以被标注为"B I B B I B I",不过具体的颗粒度往往由训练语料决定,例如上一句中,"分词任务"到底是一个词,还是两个词组成的词组,这是由标注决定的。

如果是词性标注(POS),那么上面的序列就需要增加更多符号,例如"你开心吗",可以被标注为:"Br Ba Ia Bu"

其中"Br"可以认为是一个代词的开头。

"Ba Ia"可以认为是一个形容词的开头和中间部分。

"Bu"是助词的开头。

以此讲一个句子的每个字符(字)都标注为一个新的符号序列,我们就可以得到句子的分词或词性标注了。

数据

从理想上来说,我们当然希望能有一个模型直接同时完成分词和词性标注两个任务。

但是现实中可能有一定困难,因为并不是我们能找到的所有数据集都包括了这两者的标注的,也就是有一些数据集可能只标注了分词,有些数据集标注了分词和词性。

这里我们从hankcs整理的一些历史上的分词和词性标注数据集为开始,地址为

在这里REPO里,有些数据集是标注了词性的,例如CNC(data/other/cnc/test.txt),但是其他很多数据集是没标注词性的。

这里我们使用一个半监督学习方法(Semi-supervised learning),先用有POS数据的数据集,训练一个模型。

然后用这个模型标注其他只有分词的数据集,扩充这些数据集,最终得到一个融合多个数据集的词性标注模型。

在标注其他数据集的时候,应该注意不影响其他数据集的分词结果,只是给这些分词结果一个词性而已。

注意,所谓半监督学习(Semi-supervised learning),其实是一大类算法、方法的统称,这里使用的方法只是某种非常简单的半监督学习方法的应用。

模型

在模型上,我们选择使用Albert-small版本的模型,这个版本的模型大小不到30MB,适合比较轻量级的任务,我们可以先尝试实现一个最简单的序列标注模型。

这样的模型最简单是什么样子呢?大概这样:

import tensorflow as tf
import tensorflow_hub as hub

model = tf.keras.Sequential([
    hub.KerasLayer(
        'https://code.aliyun.com/qhduan/bert_v3/raw/98354b8924d9b22fd7b9c4466e36ae9d42cc5a42/albert_base.tar.gz',
        output_key='sequence_output'
    ),
    tf.keras.layers.Dense(2),
    tf.keras.layers.Activation('softmax')
])

以上的模型本质上就实现了序列标注,这里使用的TensorFlow Hub来载入一个bert模型,这个模型的介绍可以参考:

Dense层提供到符号的转换,例如这里我们只考虑B和I两种符号,这里就可以是2。

我们可以简单测试一下这个模型:

x = tf.constant([
    ['你', '好', '吗'],
    ['你', '好', '']
])
y = tf.constant([
    [0, 1, 0],
    [0, 1, 0]
])

model(x)

最后的model(x)会输出:

<tf.Tensor: shape=(2, 3, 2), dtype=float32, numpy=array([[[0.7527009 , 0.24729903], [0.7459688 , 0.2540312 ], [0.73734486, 0.26265517]], [[0.6320372 , 0.36796272], [0.71670467, 0.28329533], [0.5 , 0.5 ]]], dtype=float32)>

这代表了模型的结果,已经输出了softmax后的两个符号的概率值。

我们还可以进一步测试模型训练,例如:

model.compile(
  loss=tf.keras.losses.SparseCategoricalCrossentropy(),
  optimizer=tf.keras.optimizers.Adam())
model.train_on_batch(x, y)

最后这一句就可以输出loss。

以上只要我们喂给模型类似上面x、y这样定义的数据,就可以训练相应的分词模型了。

技巧

以上我们实现了一个非常简单的序列标注模型。

这里我们使用非常简单的线性层作为输出,在现在的序列标注模型,输出层可能有以下几种:

· 线性层

· RNN + 线性层

· CRF

· RNN + CRF

· MRC

线性层就比较简单,如我们上面所写。

CRF层的话可以参考TensorFlow Addons的CRF实现:

MRC是指机器学习理解,这个方法也是可以用来进行分词、命名实体识别(NER)等工作的,不过在分词上不常用。

打包

TensorFlow 2.x的一个优势是,在比较多平台比较方便扩展,至少在Python、C++、NodeJS这个角度。

所以就可以很方便的把当前的TensorFlow模型打包为应用,具体例子可以参考本文这个分词的例子:


安装:pip install tfseg

分词:

>>> import tfseg
>>> tfseg.lcut('我爱北京天安门')
['我', '爱', '北京', '天安门']

词性:

>>> from tfseg import posseg
>>> posseg.lcut('我爱北京天安门')
[pair('我', 'r'), pair('爱', 'v'), pair('北京', 'ns'), pair('天安门', 'ns')]
>>> posseg.lcut('我爱北京天安门')[0].word
'我'
>>> posseg.lcut('我爱北京天安门')[0].flag
'r'

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码