分词是什么原理?比较著名的是 jieba 分词,不过系统其实有内置分词功能
英文有 byte pairing encoding 算法,中文可能也是类似算法吧
byte pairing?我觉得需要能理解句子才能分词吧
byte pairing encoding,一种根据频率的算法。假设你的 corpus 有很多句子,先分割成每个单字,然后迭代 K 次 (你自己设定一个值), 每次都找出最大频率的连着的词,比如张 + 家连续出现,并且出现频率是 500 次,是当前迭代最多的频率,那么你把"张家"合并,并且 添加到你的词典中,然后继续接下来的合并,比如"张家"+"口" 100 次,是这次迭代的最高频率,那么合并成为"张家口",在你的词典中添加"张家口",这时候你的词典有"张","家","张家","张家口", 然后训练玩了拆分一个新的句子的时候,greedy 匹配就好。以上是根据词频的 byte pairing encoding 算法。但是我想了一下,如果已经有一个词典就有词的列表,比如我就拿新华字典所有的词作为我词典的词,也就可以了,根本用不到 bpe 算法。
以上描述 bpe 算法漏了一点,你的句子,比如"张家口是 2022 年北京冬奥会的其中一个赛区", 那么一开始是拆分成“张,家,口,是,...", 然后合并"张 + 家"时候,出了向你词典添加"张家"以外,你的句子就变成"张家,口,是,"
我理解有两种分词方法,一种是基于规则集,一种是楼上说的统计方法。
统计方法并不需要去理解句子,比如最简单的一个做法(也类似楼上)就是将材料切割成若干子集,比如 1 2 3 => 1,12,123,2,23,3,再由对这些子集的词数统计来确认它们应不应该是一个词。
但这会造成子集矢量空间的维度灾难,因此一般就要用到一些特征选择和提取的方法进行降维。另外还要考虑量纲以及可比性的问题,比如对高频词(的、是 ...)之类的统计意义的处理,一般通过归一化解决。
更具体推荐查阅自然语言处理的资料进行了解。