简介
分词是自然语言处理(NLP)中的一个基本任务,它涉及将连续的文本序列切分成多个有意义的单元,这些单元通常被称为"词"或"tokens"。在英语等使用空格作为自然分隔符的语言中,分词相对简单,因为大部分情况下只需要根据空格和标点符号来切分文本。
然而,在汉语等语言中,并没有明显的单词界限标记(如空格),因此汉语分词比较复杂。汉字序列必须被正确地切割成有意义的词组合。例如,"我爱北京天安门",应该被正确地划分为"我/爱/北京/天安门"。
方法
中文分词技术主要可以归类为以下几种方法:
-
基于字符串匹配的方法:这种方法依赖一个预先定义好的字典来匹配和确定句子中最长能够匹配上的字符串。这包括正向最大匹配法、逆向最大匹配法以及双向最大匹配法。
-
基于理解的方法:通过模拟人类理解句子含义进行分词,考虑上下文、句法结构和其他信息。
-
基于统计学习模型:利用机器学习算法从大量已经人工标注好了分词结果的数据集里学习如何进行有效地分词。常见算法包括隐马尔可夫模型(HMM)、条件随机场(CRF)以及近年来流行起来基于深度学习框架构建神经网络模型(RNNs、CNNs、LSTMs、Transformer、BERT等)。
-
混合方法:结合以上几种不同策略以提高精确度和鲁棒性。
-
基于规则: 通过制定一系列规则手动或半自动地进行文字断开, 这通常需要专业知识并且效率不高, 但可以在特定情境下发挥作用。
Python栗子
基于字符串匹配,最大前向匹配,代码如下
python
def max_match_segmentation(text, dictionary):
max_word_length = max(len(word) for word in dictionary)
start = 0
segmentation = []
while start < len(text):
for length in range(max_word_length, 0, -1):
if length > len(text) - start:
continue
word = text[start:start + length]
if word in dictionary:
segmentation.append(word)
start += length
break
else: # 如果没有找到,则按单字切分
segmentation.append(text[start])
start += 1
return segmentation
# 示例字典和用法:
dictionary = {"我", "爱", "北京", "天安门"}
text_to_segment = "我爱北京天安门"
segments = max_match_segmentation(text_to_segment, dictionary)
print("分词结果:", "/ ".join(segments))
构建思路(如何实现基于统计的分词方法)
基于统计学习的中文分词方法其核心思想是从大量已经分词的文本(语料库)中学习如何将连续的汉字序列切分成有意义的词汇。通常包括以下几个步骤:
-
语料库准备:收集并整理一定量的已经进行过人工分词处理的文本数据,作为训练集。
-
特征提取:从训练数据中提取有助于模型学习和预测的特征。在传统统计模型中,这些特征可能包括:
- 字符及其邻近字符
- 词性标注信息
- 字符组合频率
-
概率模型选择:选择合适的统计概率模型来估算不同切分方式出现的概率。常见模型包括:
- 隐马尔可夫模型(HMM)
- 条件随机场(CRF)
- 最大熵模型
- 支持向量机(SVM)
-
参数估计与训练:利用选定的统计学习算法对特征和标签进行建模,并通过算法调整参数以最大化某种性能指标或者最小化误差。
-
解码与优化:使用如Viterbi算法等解码技术找到给定字序列下最可能对应的词序列。
-
评估与调整:通过交叉验证、留出验证或引入开发集等方式,在非训练数据上评价分词效果,并据此调整特征或者优化参数。
-
迭代改进: 在实际应用过程中,根据反馈持续追踪新出现单字、新兴流行语等元素,更新语料库并重新训练以保证系统性能不断提升。
基于统计学习方法进行中文分词具有较强实用性和广泛适用性。它不依赖复杂规则体系,而是通过从数据本身"学会"如何正确地将句子划分为单个单词或短语。
分词参考链接
- tokenizer https://huggingface.co/docs/tokenizers
- 微型中文分词器 https://github.com/howl-anderson/MicroTokenizer
- 中文分词jieba https://github.com/fxsjy/jieba
- THULAC:一个高效的中文词法分析工具包https://github.com/thunlp/THULAC-Python