使用神经网络的中文分词

数据挖掘 神经网络 文本
2022-03-06 08:14:29

中文文本使用包含数万个字符的字符集。汉语中的单词最常见的是由 1、2 或 3 个字符组成。中文文本中的单词之间没有空格或其他标记,因为母语人士可以轻松地从文本中分割单词。为了辅助语言学习工具,有一种自动分割文本块内单词的方法会很有帮助。

一些方法使用基于字典的贪心算法方法,但由于大多数贪心算法存在的常见问题而容易失败。

我想尝试使用神经网络,但我的问题是,如何将字符编码到网络的输入神经元?

我不是在谈论 OCR。这些字符是已知的并以 unicode 编码,但我如何将字符呈现给网络的输入?

我可以想象的一种方法是让网络一次查看 100 个字符的部分文本,并为每个字符设置一个神经元。但是我如何将角色表示为网络的数字?对字符使用 unicode 整数值似乎不是一个好主意。

2个回答

所以,主要问题是如何在你的中文分词任务中表示汉字。

由于实际上这些字符是非序数分类变量,我们会将它们表示为一种热编码(https://medium.com/@michaeldelsole/what-is-one-hot-encoding-and-how-to-do-it -f0ae272f1179 ) 维度 n = 数据集中唯一汉字的数量。

有时 n 可能非常大。所以在这种情况下,我们通常有一个 Embedding 层,它可以减少数据稀疏性并折叠维度的数量。( https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding#:~:text=Arguments%20%20%20%20input_dim%20%20%20,the%20embed%20. ..%20%202%20more%20rows%20 )

我认为这里隐藏了三个问题:

  1. 如何自己编码中文(以及可能的其他)字符?
  2. 什么是合适的神经架构?
  3. 如何将这些字符输入神经网络?

让我们一一解决:

如何对字符进行编码

在这种情况下,对离散元素进行编码的典型方法是使用封闭字典。在这种情况下,要编码的元素是字符,所以我们应该:

  1. 获取我们的训练数据并提取所有可能存在的字符(可能是汉字、罗马数字和数据中存在的其他外来字母,如拉丁字母或西里尔字母)

  2. 创建一个列表N最常见的。为了尺寸N适当地,我们应该考虑到当前的神经网络架构将无法处理超过 50K 的元素。

神经架构

鉴于这个问题可以类似于语言建模任务来表述,我想说最合适的架构是LSTM / GRU、一维卷积网络和Transformer(或其变体之一)。如果我们的架构可以处理无限上下文,我们可能会受益,那么我想说的是 LSTM 和TransformerXL之间的选择。我认为分词不需要非常繁重的处理,所以我会选择 LSTM,它在推理时非常轻。

由于字符是离散的,网络的第一层将是嵌入层,将离散字符编码为连续向量。这些向量的大小是我们应该决定其值的超参数。

网络的输出在开始单词的字符位置可能是 1,在其他位置可能是 0。

如何将字符输入神经网络

鉴于我们建议使用可以处理无限上下文的神经架构,那么我们也应该在输入数据准备中支持它,即如果我们选择 LSTM,则使用普通语言风格的截断反向传播(TBPTT)模型,我们准备小批量,以便我们可以获取一个批次的最后一个隐藏状态并将其用于下一个的初始化。