AllenNLP框架学习笔记(数据篇之tokenizers)

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))

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, ...})

小结

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

参考资料

### 文本摘要生成学习笔记 文本摘要是自然语言处理领域的重要任务之一,其目标是从原始文档中提取关键信息并生成简洁的摘要。以下是关于文本摘要生成的学习笔记及相关资料。 #### 1. 文本摘要的基本方法 文本摘要可以分为抽取式和生成式两种主要方法。抽取式摘要通过从原文中选择最重要的句子或短语来构建摘要[^2]。生成式摘要则利用自然语言生成技术创建全新的摘要内容,这种方法通常基于深度学习模型实现[^3]。 #### 2. 抽取式摘要算法:TextRank TextRank是一种基于图的排序算法,用于从文本中提取关键句子以生成摘要。它借鉴了PageRank的思想,将文本分割成若干组成单元(如单词或句子),并通过建立图模型对这些单元进行重要性排序[^1]。以下是一个使用TextRank生成摘要的Python代码示例: ```python from sumy.parsers.plaintext import PlaintextParser from sumy.nlp.tokenizers import Tokenizer from sumy.summarizers.text_rank import TextRankSummarizer # 示例文本 text = """ 自然语言处理是一门融合语言学、计算机科学和数学的学科。 它涉及与语言处理相关的数据挖掘、机器学习以及近年来非常流行的深度学习等。 文本分类、信息检索和摘要生成是自然语言处理中的重要任务。 """ # 创建解析器 parser = PlaintextParser.from_string(text, Tokenizer("chinese")) # 初始化TextRank摘要生成器 summarizer = TextRankSummarizer() # 生成摘要(选择前两句话) summary = summarizer(parser.document, sentences_count=2) for sentence in summary: print(sentence) ``` 上述代码展示了如何使用TextRank算法从给定文本中提取关键句子以生成摘要[^1]。 #### 3. 生成式摘要算法:指针生成网络 生成式摘要通常依赖于神经网络模型,其中指针生成网络(Pointer-Generator Network)是一种经典且有效的模型。该模型结合了注意力机制和指针网络的优点,能够在生成新词的同时复制原文中的词语,从而提高摘要的质量和准确性[^3]。 以下是一个使用指针生成网络生成摘要的简化流程: - **数据准备**:将文本数据转换为适合模型输入的格式,包括分词、编码等预处理步骤。 - **模型定义**:加载预训练的语言模型,并在其基础上添加指针生成网络模块。 - **训练与评估**:使用交叉熵损失函数训练模型,并在测试集上评估生成摘要的质量。 #### 4. 模型评估与优化 评估文本摘要质量的常用指标包括ROUGE(Recall-Oriented Understudy for Gisting Evaluation)、BLEU(Bilingual Evaluation Understudy)等。为了提高摘要生成的效果,可以采用数据增强、模型集成等策略。此外,低秩适配(LoRA)、量化微调(QLoRA)等技术也可以用于减少模型训练成本并提升性能。 #### 5. 应用场景 文本摘要广泛应用于新闻报道、科技文献、社交媒体等领域。例如,在新闻网站中,自动摘要生成可以帮助用户快速了解文章主要内容;在科研领域,摘要生成工具能够有效减轻研究人员阅读大量文献的压力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值