当前位置:   article > 正文

AllenNLP框架学习笔记(数据篇之tokenizers)_allennlp.data.tokenizers.token类

allennlp.data.tokenizers.token类

tokenizers是数据模块中的一个子模块,在里面主要包含了token与tokenizer的定义和使用,现在做一个简单的介绍,描述字符串是如何载入到TextFields中的。

Token

简单的token抽象,其属性包括文本,偏移量,pos tag,依存关系等,tokenizer的输出被定义为一连串(list)的Token。

Tokenizer

分词器类,Tokenizers将字符串分割成独立的token,如果需要自己定义一个分词类的话,通过重写其tokenize方法便可以实现,可分为word-level与character-level。Allennlp里一般有如下三种方法:

  • Characters (“AllenNLP is great” → [“A”, “l”, “l”, “e”, “n”, “N”, “L”, “P”, " ", “i”, “s”, " ", “g”, “r”, “e”, “a”, “t”])
  • Wordpieces (“AllenNLP is great” → [“Allen”, “##NL”, “##P”, “is”, “great”])
  • Words (“AllenNLP is great” → [“AllenNLP”, “is”, “great”])

需要注意的是在Characters 中,空格也是一个字符,WordpiecesWords 相似,但是进一步将单词分为子单词单元。在AllenNLP中,如果每个单词有单独的向量很重要,用户选择的分词法决定了哪些对象将在模型中被分配单个向量(例如,这样用户就可以为它预测一个NER或POS标记),即使希望该向量依赖于字符级表示,用户也需要从词级分割开始。

常用的Tokenizers如下:

  • spaCy’s tokenizer,支持多种语言,不过需要科学上网;
  • PretrainedTransformerTokenizer,使用Hugging Facetransformers库中的 tokenizer
  • CharacterTokenizer,它将字符串拆分为单个字符,包括空格。
  • WhitespaceTokenizer,默认已经按照空格分好了词,将字符串按照空格切分
  • LettersDigitsTokenizer,按照数字与标点符号进行切分

下面是tokenizer的代码示例:

from allennlp.data.tokenizers.letters_digits_tokenizer import LettersDigitsTokenizer
from allennlp.data.tokenizers import CharacterTokenizer, WhitespaceTokenizer
from allennlp.data.tokenizers import Tokenizer, Token
from typing import List
from overrides import overrides
import jieba

english_text = "hello world ! Today is sunday ! I'm going to play Civilization6 ."
chinese_text = "大家好啊!今天是星期日!我准备玩文明6。"

# 按照空格切分
print("white space tokenizer result:", WhitespaceTokenizer().tokenize(english_text))
print("white space tokenizer result:", WhitespaceTokenizer().tokenize(chinese_text))

# 按照字符切分
print("character tokenizer result:", CharacterTokenizer().tokenize(english_text))
print("character tokenizer result:", CharacterTokenizer().tokenize(chinese_text))

# 除了空格,按照数字与标点符号进行切分
print("letter digits tokenizer result:", LettersDigitsTokenizer().tokenize(english_text))
print("letter digits tokenizer result:", LettersDigitsTokenizer().tokenize(chinese_text))


# 自定义jieba分词类,实现中文分词

class JiebaTokenizer(Tokenizer):
    @overrides
    def tokenize(self, text: str) -> List[Token]:
        return [Token(_) for _ in list(jieba.cut(text))]


print("jieba tokenizer result:", JiebaTokenizer().tokenize(chinese_text))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

tokenizers模块中还有sentence_splitter模块,实现了分句接口。

tokenizer都实现了一个tokenize()方法,该方法返回Token列表。Token是一个轻量级的数据类,类似于spaCyToken

TextFields

即文本字段,继承了SequenceField,代表一连串字符token。在建立本对象之前,需要先使用
Tokenizer类对原始文本进行分词。构造函数须有tokens,token_indexers两个参数。

TextFieldTokenizers获取Token列表,并将每个Token表示为一个数组,模型可以将该数组转换为向量。 TextFields实现了Field API,该API包括以下方法:对词汇表项目进行计数,将字符串转换为整数,然后转换为张量,并使用适当的填充将若干张量组合在一起。 为了在实际操作中保持灵活性,TextField将这些操作的大部分功能转移给了TokenIndexers集合,该集合实际上负责确定如何表示每个Token。 创建一个TextField,代码编写如下:

tokenizer = ...  # Whatever tokenizer you want
sentence = "We are learning about TextFields"
tokens = tokenizer.tokenize(sentence)
token_indexers = {...}  # we'll talk about this in the next section
text_field = TextField(tokens, token_indexers)
...
instance = Instance({"sentence": text_field, ...})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

小结

通过上面的代码,我们知道了text经过tokenizer的处理,得到一连串的token,而这些token将会作为初始化参数实例化TextField类,同时TextField类的实例化还需要传入token_indexers,在下一节,将介绍token_indexers是什么和怎么使用。

参考资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/828553
推荐阅读
相关标签
  

闽ICP备14008679号