1 引言

在建模文本语料的相关模型时,避免不了的一个操作就是构建词表。通常来说一个常用的流程就是:①对原始语料进行分词或者是分字,即tokenize;②利用Counter来对tokenize后的结果进行计数处理,并去掉出现频率小于某个阈值的词;③根据计数结果分别建立一个字典和一个列表用于将词转换为索引以及将索引转换为词。

虽然这部分代码说多不多,但是我们还可以通过一个更方便的方法来直接根据文本构建一个词表。

2 构建词表

在正式构建词表之前,我们需要定义一个tokenize方法,即如何对原始文本进行切分。例如中文是分词还是分字等。

2.1 定义tokenize

如果是对类似英文这样的语料进行处理,那就是直接按空格切分即可。但是需要注意的是要把其中的逗号和句号也给分割出来。因此,这部分代码可以根据如下方式进行实现:

可以看到,其实也非常简单。例如对于如下文本来说

其tokenize后的结果为:

当然,如果是中文类的语料,那么可以通过如下方式进行实现:

其中word=True表示按字进行切分。例如对于如下文本来说

其tokenize后的结果为:

2.2 建立词表

在介绍完tokenize的实现方法后,我们就可以正式通过torchtext.vocab中的Vocab方法来构建词典了,代码如下:

在上述代码中,第3行代码用来指定特殊的字符;第5-7行代码用来遍历文件中的每一个样本(每行一个)并进行tokenize和计数,后续笔者也会对counter.update进行介绍;第8行则是返回最后得到词典。

例如在根据如下3行样本进行词表构建

将会得到如下所示的结果:

从上述示例可以看出,在得到构建好的词表类之后,只需要通过对应的方法便可以得到相应的结果。

介绍完词表的构建后,这里再来顺便介绍一下如何合并两个字典,也就是上面counter.update的用法。

3 合并字典与列表

3.1 合并字典

在某些场景下,我们需要对两个(多个)字典进行合并。例如需要将如下两个字典进行合并:

且合并后的结果为:

那么应该如何操作呢?由于两个字典并不能够直接进行相加,因此首先需要将各个字典转换为Counter类,然后再进行相加。具体代码如下:

当然,如果只是两个字典相加,那么只用一行代码即可:

3.2 合并列表

在某些场景下,我们需要对两个(多个)列表进行合并,从而得到一个包含有各个元素出现频率的字典。例如需要将如下两个列表:

合并为:

那么只需要通过如下代码即可实现:

当然,除了在构建词表的时候可以使用这种方法,在对列表进行重复元素查找或者统计时同样可以使用本方法。

4 总结

在本篇文章中,笔者首先介绍如何对文本进行tokenize操作;然后介绍了如何通过torchtext.vocab中的Vocab方法来构建词典;最后顺便介绍了如何通过Counter来合并字典与列表。在下一篇文章中,笔者将会介绍如何在构建好词表的基础上快速构建相应的文本数据集。

本次内容就到此结束,感谢您的阅读!如果你觉得上述内容对你有所帮助,欢迎分享至一位你的朋友!若有任何疑问与建议,请添加笔者微信nulls8或加群进行交流。青山不改,绿水长流,我们月来客栈见!