自然语言处理中的分词技术

自然语言处理(NLP)领域,分词技术是构建模型的基础。分词是将文本分解成更小的单元——分词(tokens)的过程。这些分词可以是单词、字符或子词。Hugging Face公司提供了一个名为Tokenizers的库,它是一个高效的文本分词工具,能够帮助更好地理解和处理语言。

分词的重要性

分词是NLP中不可或缺的一环。无论是传统的NLP方法,如计数向量化器(Count Vectorizer),还是基于深度学习的高级架构,如Transformers,分词都是处理原始文本的基础步骤。分词后,文本中的语句或短语被转换成整数,然后输入到深度学习模型中。例如,基于Transformer的模型——NLP中最先进的深度学习架构——就是在分词级别处理原始文本的。同样,NLP中最受欢迎的深度学习架构,如RNN、GRU和LSTM,也是在分词级别处理原始文本。

Hugging Face的Tokenizers库

Hugging Face因其提供的Transformer库而广为人知,该库提供了一个高级API,用于访问基于Transformer的最新模型,如BERT、GPT2、ALBERT、RoBERTa等。Hugging Face团队还维护着另一个高效且快速的文本分词库——Tokenizers。最近,他们发布了该库的v0.8.0版本。

Tokenizers v0.8.0的新特性

Tokenizers v0.8.0版本带来了许多改进和修复。现在,它可以同时处理预分词序列和原始文本字符串。训练自定义分词器的速度提高了五到十倍。保存分词器也变得前所未有的简单,只需一行代码即可将分词器保存为JSON文件。

开始使用Tokenizers

将使用Google Colab进行演示,但也可以选择使用任何其他平台或IDE。首先,让快速安装tokenizers库:

!pip install tokenizers

可以通过执行以下命令来检查库的版本:

tokenizers.__version__

接下来,将导入所需的库和BertWordPieceTokenizer:

from tokenizers import BertWordPieceTokenizer

还需要下载一个词汇表文件:

!wget https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt

现在,让对一个示例句子进行分词:

tokenizer = BertWordPieceTokenizer('bert-base-uncased-vocab.txt') encoded_output = tokenizer.encode("Language is a thing of beauty. But mastering a new language from scratch is quite a daunting prospect.")

“encoded_output”的三个主要组成部分是:

  • ids - 分配给输入句子的分词的整数值。
  • tokens - 分词后的分词。
  • offsets - 输入句子中所有分词的位置。
print(encoded_output.ids) print(encoded_output.tokens) print(encoded_output.offsets)

保存和加载分词器

Tokenizers库还允许轻松地将分词器保存为JSON文件,并在以后使用时加载它。这对于大型文本数据集非常有用,不需要一次又一次地初始化分词器。

tokenizer.save('my_tokenizer.json') tokenizer = BertWordPieceTokenizer('my_tokenizer.json')

编码预分词序列

sentence = "Language is a thing of beauty. But mastering a new language from scratch is quite a daunting prospect." print(sentence.split()) encoded_output = tokenizer.encode(sentence.split()) !wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-v1.zip !unzip wikitext-103-v1.zip with open('wiki.train.tokens', 'r', encoding='utf-8') as f: sequences = [line.strip().split() for line in f.readlines()] start_time = time.time() tokenizer.encode_batch(sequences) end_time = time.time() print(end_time - start_time)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485