1. 自然语言处理基础
1.1 中文分词技术解析
中文分词是NLP处理的首要环节,与英文不同,中文文本没有天然的空格分隔符。以句子"自然语言处理很有趣"为例,理想的分词结果应为["自然语言","处理","很","有趣"]。当前主流分词技术可分为三大类:
基于词典的分词方法:
- 正向最大匹配法(FMM)从右向左扫描,每次取词典中最长的词
- 逆向最大匹配法(BMM)从左向右扫描,准确率通常比FMM高3%左右
- 双向最大匹配法结合两者优势,通过规则解决分歧情况
实际工程中常采用改进的词典结构:
python复制class TrieNode:
def __init__(self):
self.children = {}
self.is_word = False
def build_trie(dict_words):
root = TrieNode()
for word in dict_words:
node = root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_word = True
return root
基于统计的分词方法:
- 隐马尔可夫模型(HMM)将分词视为序列标注问题,采用B(词首)、M(词中)、E(词尾)、S(单字词)标签
- 条件随机场(CRF)能捕捉更多上下文特征,典型特征模板包括:
- 当前字符的前后字符
- 字符的构词属性(数字、字母、标点等)
- 字符在词典中的出现情况
深度学习分词方法:
- BiLSTM-CRF模型已成为当前主流,其网络结构通常包含:
- Embedding层(字符嵌入+预训练词向量)
- 双向LSTM层(捕捉上下文特征)
- CRF层(建模标签转移概率)
实际应用中需要注意:
- 领域适配问题:通用分词器在医疗、法律等专业领域表现下降,需增量训练
- 新词发现能力:结合统计指标(互信息、左右熵)提升OOV识别
- 分词粒度控制:根据下游任务需求调整(如搜索需细粒度,分类需粗粒度)
1.2 词向量训练原理与实践
词向量技术经历了从静态到动态的演进过程:
Word2Vec的两种模型架构:
- Skip-gram:通过中心词预测上下文,适合小规模数据
- CBOW:通过上下文预测中心词,训练速度更快
以Skip-gram为例,其负采样目标函数为:
code复制L = logσ(v_w·v_c) + ∑_{i=1}^k E_{w_i~P_n(w)}[logσ(-v_{w_i}·v_c)]
其中k通常取5-20,噪声分布P_n(w)采用3/4次幂的unigram分布
GloVe的全局统计特性:
通过构建词共现矩阵X,优化目标:
code复制J = ∑_{i,j=1}^V f(X_{ij})(w_i^T w_j + b_i + b_j - logX_{ij})^2
f(x)为加权函数,对高频词进行截断:
code复制f(x) = (x/x_max)^α if x < x_max else 1
动态词向量技术:
- ELMo采用双向LSTM结构,通过语言模型任务预训练
- 其词表示是各层输出的线性组合:
code复制其中γ和s_j为可训练参数h_k = γ∑_{j=0}^L s_j h_{k,j}
词向量应用中的注意事项:
- 领域适配:金融领域"苹果"更接近"股票"而非水果
- 多义词处理:静态词向量无法解决一词多义问题
- 维度选择:通常300-50
