赞
踩
“token”主要用于文本数据的预处理阶段,将文本拆分为基本的词汇单元;“embedding”主要用于将离散的词汇单元连续向量化表示,以便在复杂的机器学习模型中进行处理;“encoding”则主要用于将文本数据转换为神经网络等深度学习模型可处理的向量表示。在自然语言处理(NLP)中,token是指文本中最小的语义单元。比如,一个句子可以被分割成若干个单词,每个单词就是一个token。例如,“I love you”这个句子可以被分割成三个token:“I”,“love”和“you”。token可以帮助我们把文本分解成更容易处理和分析的部分。
参考:https://zhuanlan.zhihu.com/p/649543347
通常情况下,Tokenizer有三种粒度:word/char/subword
word: 按照词进行分词,如: Today is sunday. 则根据空格或标点进行分割[today, is, sunday, .]
character:按照单字符进行分词,就是以char为最小粒度。 如:Today is sunday. 则会分割成[t, o, d,a,y, … ,s,u,n,d,a,y, .]
subword:按照词的subword进行分词。如:Today is sunday. 则会分割成[to, day,is , s,un,day, .]
可以看到这三种粒度分词截然不同,各有利弊。常见的子词算法有Bye-Pair Encoding (BPE) / Byte-level BPE(BBPE)、Unigram LM、WordPiece、SentencePiece等。
SentencePiece:SentencePiece它是谷歌推出的子词开源工具包,它是把一个句子看作一个整体,再拆成片段,而没有保留天然的词语的概念。一般地,它把空格也当作一种特殊字符来处理,再用BPE或者Unigram算法来构造词汇表。SentencePiece除了集成了BPE、ULM子词算法之外,SentencePiece还能支持字符和词级别的分词。
Tokenizer包括训练和推理两个环节。训练阶段指得是从语料中获取一个分词器模型。推理阶段指的是给定一个句子,基于分词模型切分成一连串的token。
概括:
1.分词粒度: 根据不同的切分粒度可以把tokenizer分为,基于词的切分,基于字的切分和基于subword的切分。 基于subword的切分是目前的主流切分方式。
2. subword的切分包括: BPE(/BBPE), WordPiece 和 Unigram三种分词模型。其中WordPiece可以认为是一种特殊的BPE。
3. 完整的分词流程包括:文本归一化,预切分,基于分词模型的切分,后处理。
4. SentencePiece是一个分词工具,内置BEP等多种分词方法,基于Unicode编码并且将空格视为特殊的token。这是当前大模型的主流分词方案。
作用:
1.分词。tokenizer将字符串分为一些sub-word token string,再将token string映射到id,并保留来回映射的mapping。从string映射到id为tokenizer encode过程,从id映射回token为tokenizer decode过程。映射方法有多种,例如BERT用的是WordPiece,GPT-2和RoBERTa用的是BPE等等,后面会详细介绍。
2.扩展词汇表。部分tokenizer会用一种统一的方法将训练语料出现的且词汇表中本来没有的token加入词汇表。对于不支持的tokenizer,用户也可以手动添加。
3.识别并处理特殊token。特殊token包括[MASK], <|im_start|>, <sos>, <s>等等。tokenizer会将它们加入词汇表中,并且保证它们在模型中不被切成sub-word,而是完整保留。
子词分词:
Byte Pair Encoding (BPE)
Byte-Pair Encoding(BPE)是最广泛采用的subword分词器。
训练方法:从字符级的小词表出发,训练产生合并规则以及一个词表
编码方法:将文本切分成字符,再应用训练阶段获得的合并规则
经典模型:GPT, GPT-2, RoBERTa, BART, LLaMA, ChatGLM等
WordPiece
Google的Bert模型在分词的时候使用的是WordPiece算法。与BPE算法类似,WordPiece算法也是每次从词表中选出两个子词合并成新的子词。与BPE的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。
bert用的是wordpiece, wordpiece算法可以看作是BPE的变种。不同的是,WordPiece基于概率生成新的subword而不是下一最高频字节对。WordPiece算法也是每次从词表中选出两个子词合并成新的子词。BPE选择频数最高的相邻子词合并,而WordPiece选择使得语言模型概率最大的相邻子词加入词表。 总结来说,WordPiece每次选择合并的两个子词,通常在语料中以相邻方式同时出现。 比如说 P(ed) 的概率比P(e) + P(d)单独出现的概率更大,可能比他们具有最大的互信息值,也就是两子词在语言模型上具有较强的关联性。
Unigram Language Model (ULM)
与WordPiece一样,Unigram Language Model(ULM)同样使用语言模型来挑选子词。不同之处在于,BPE和WordPiece算法的词表大小都是从小到大变化,属于增量法。而Unigram Language Model则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。
如何使用上述子词算法?一种简便的方法是使用SentencePiece,它是谷歌推出的子词开源工具包,其中集成了BPE、ULM子词算法。除此之外,SentencePiece还能支持字符和词级别的分词。更进一步,为了能够处理多语言问题,sentencePiece将句子视为Unicode编码序列,从而子词算法不用依赖于语言的表示。https://zhuanlan.zhihu.com/p/191648421
ES内置了多种分词器,standard分词器是默认分词器,按词拆分、小写;simple分词器:按非字母拆分,小写,过滤非字母;wihtespace分词器:按空格分词。IK分词器是推荐较多的中文分词器,支持粗力度和细粒度分词,需要安装插件使用。
分词器的组成
分词器是专门处理分词的组件,分词器由以下三部分组成:
Character Filters:针对原始文本处理,比如去除 html 标签
Tokenizer:按照规则切分为单词,比如按照空格切分
Token Filters:将切分的单词进行加工,比如大写转小写,删除 stopwords,增加同义语
同时 Analyzer 三个部分也是有顺序的,从图中可以看出,从上到下依次经过 Character Filters,Tokenizer 以及 Token Filters,这个顺序比较好理解,一个文本进来肯定要先对文本数据进行处理,再去分词,最后对分词的结果进行过滤。
其中,ES 内置了许多分词器:
Standard Analyzer - 默认分词器,按词切分,小写处理
Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
Stop Analyzer - 小写处理,停用词过滤(the ,a,is)
Whitespace Analyzer - 按照空格切分,不转小写
Keyword Analyzer - 不分词,直接将输入当做输出
Pattern Analyzer - 正则表达式,默认 \W+
Language - 提供了 30 多种常见语言的分词器
Customer Analyzer - 自定义分词器
分词器简单而言就是将字符序列转化为数字序列,对应模型的输入。
分词器是用来实现分词的,分词器由三部分组成:字符过滤器、分词器和Token过滤器,字符过滤器:对原始文本进行过滤;分词器:按照一定规则进行分词;Token过滤器:对分词进行处理,转小写,移除停用词,添加同义词。
分词器由Character Filter、Tokenizer和Token Filter三部分组成,其工作流程依次为Character Filter、Tokenizer和Token Filter,其中Character Filter和Token Filter可以为空。
一、中文分词工具
https://cloud.tencent.com/developer/article/1747734
(1)Jieba
(2)snowNLP分词工具
(3)thulac分词工具
(4)pynlpir 分词工具
(5)StanfordCoreNLP分词工具
(6)Hanlp分词工具
哈工大LTP、中科院计算所NLPIR、清华大学THULAC、jieba
二、英文分词工具
在目前的分词技术中,有几个比较流行和广泛应用的分词工具。下面介绍一些比较常用的分词工具,以供参考。
比较 :
准确率、社区活跃度、适应范围、速度等。北京大学PKUse和清华大学THULAC可供参考。
可根据个人不同的需求去选择不同的分词工具。将自己的语料实际放进去看一下最后的结果。
这样会给你一些参考价值。综合速度、社区活跃度、更新频率和语料结果,
个人更倾向于jieba分词,专业的领域交给专业的团队去做。
只有Thulac的结果比较特别,StanfordCoreNLP的运行占用大量内存和CPU,
尝试另一句话‘这本书很不错’,jieba无法分出‘本’,其他都可以完整分词,
不过StanfordCoreNLP依然占用大量内存和CPU。
https://github.com/ysc/cws_evaluation
1、一个好的分词工具不应该只能在一个数据集上得到不错的指标,而应该在各个数据集都有很不错的表现。从这一点来看,thulac和ltp都表现非常不错。
2、因为分词是个基础部件,分词速度对于一个分词工具来说也至关重要。从这一点来看,thulac和jieba表现的不错。
3、大家都知道,基本的分词依赖模型,但真正想用分词工具来解决应用层面上的问题,都需要借助于词库,本文测试的4个工具均支持用户自定义词库。
4、特别需要强调的一点是,哈工大的ltp支持分词模型的在线训练,即在系统自带模型的基础上可以不断地增加训练数据,来得到更加丰富、更加个性化的分词模型。https://www.sohu.com/a/120375125_465975
停用词(Stop words)是指在文本处理过程中被忽略或删除的常见词汇。这些词汇通常是频繁出现的功能词或无实际意义的词语,例如介词、连词、冠词、代词等。停用词通常对于文本的含义分析没有太大贡献,且会占据大量的存储空间和计算资源。因此,在文本处理任务(如文本分类、信息检索等)中,常常会预先定义一组停用词,并在处理过程中将它们从文本中移除。停用词的具体内容可以根据任务的特定需求而定,通常包括例如:“a”, “an”, “the”, “is”, “are”, “and”, "of"等常见词汇。选择停用词列表时,需要综合考虑语言的特点、任务的领域和目标等因素。
大语言模型的词表扩充
LLaMA词表中的中文token比较少(只有几百个)。为了解决这些问题,我们可能就需要进行中文词表扩展。比如:在中文语料库上训练一个中文tokenizer模型,然后将中文 tokenizer 与 LLaMA 原生的 tokenizer 进行合并,通过组合它们的词汇表,最终获得一个合并后的 tokenizer 模型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。