Day 02
文本处理流程
- Pipeline
Day02-01图
分词 Word Segementation
- 分词工具
- Jieba分词
- SnowNLP
- LTP
- HanNLP
最大匹配算法 max-matching
- 本质上是贪心算法
- 可能无法找到全局最优解
- 参数
- max_len
- 缺点
- 只能保证局部最优
- 效率低
- 难处理歧义 (不能考虑语义)
前向最大匹配算法 forward-max matching
- 步骤
- 取 前 $max\_len$ 个字符为 str
- 若 str 在词典里则返回第一步, 否则
- 取 $max\_len-1$ 个字符为 str
- 重复第二步
def max_matching(ss:str,d:set): if len(ss)==0 or ss in d: return ss else: return max_matching(ss[:-1],d) def forward_max_matching(s:str,d:set,max_len:int) i=0 result=list() while i<len(s): word=max_matching(s[i:i+max_len],d) result.append(word) i+=len(word)
后向最大匹配 back-ward-max matching
- 从后往前去
考虑语义 Incorporate Semantic
- 步骤
- 输入
- 生成所有的分割
- 通过工具,选择最好的分割 (例如语言模型)
- 概率过小问题
有时候会出现概率是0.0000001的情况,此时浮点数可能溢出- 解决方法:使用 $\log$ 函数
语言模型 Language Model
- 例子,以Unigram为例
- “经常有意见分歧”
- P(S1)=0.3 P(经常,有,意见,分歧)=P(经常)P(有)P(意见)P(分歧)=0.3
- P(S2)=0.2 P(经常,有意见,分歧)=P(经常)P(有意见)P(分歧)=0.2
- “经常有意见分歧”
维特比算法 Viterbi Algorithm
- 本质动态规划
拼写错误纠正 Speel Correction
- 两类错误
- 错别字,字母错误
- 语法上错误 (如时态)
- 修正方法
- insert
- delete
- replace
- 编辑距离 edit distance
- 对于一个input,在所有候选方案candidates中,选择编辑距离最小的方案
- 使用DP
Alternative Way
- 步骤
- 用户输入
- 生成编辑距离为1或2的字符串
- 为什么只生成这些字符串?
因为用户出错大多在这个范围之内
- 为什么只生成这些字符串?
- 过滤
- 如何过滤?
- 问题定义
给定一个字符串s,要找出最有可能成为正确字符串的c, 即 $\hat c=\arg\max_{c\in \text{candidates}}p(c|s)$ - 推导 基于贝叶斯定律
$\begin{aligned}\hat c&=\arg\max_{c\in \text{candidates}}p(c|s) \\ &=\arg\max_{c\in \text{candidates}} \frac{p(s|c)\cdot p(c)}{p(s)} \\ &=\arg\max_{c\in \text{candidates}} p(s|c)\cdot p(c) \text{, because p(s) is constant} \end{aligned}$- $p(s|c)$ 基于统计
例如 $p(\text{appl}|\text{apple})$,即将apple打成appl的概率 - $p(c)$ 基于unigram probability得出
- $p(s|c)$ 基于统计
- 问题定义
- 如何过滤?
- 返回
停用词过滤 Filtering Words
- 对于NLP的应用,通常先把停用词、使用频率过低的词过滤掉
例如 “the”, “an”, “their”- 但是,也需要考虑应用场景
标准化操作
通常出现在英文,例如went go going都指向go
Stemming
- 基于 语言学家 整理的合并规则
- 不保证把词汇合并成词典中的单词
https://tartarus.org/martin/PorterStemmer/java.txt
文本的表示 Word Representation
- One-hot representation 生成句向量
- 例子
word-repre.png
- Sentence Representation(bool)
sentence-repre-boolean.png
- 即使一个单词重复出现,也置1
- Sentence Representation(count)
sentence-repre-count.png
- 考虑词频
- 例子
文本的相似度 Sentence Similarity
- 计算距离(欧氏距离):$d=|s1-s2|$
- 计算两局向量的距离
- 计算相似度(余弦相似度) $d=s1\cdot s2/(|s1|*|s2|)$
- 除以 $(|s1|*|s2|)$ 相当于一个 normalization
tf-idf 文本表示方法
- 定义
$tdidf(w)=tf(d,w)* idf(w)$- $tf(d,w)$ 文档$d$ 中 $w$的词频
- $idf(w)=\log{\frac{N}{N(w)}}$
- $N$ 语料库中的文档总数
- $N(w)$ 有单词 $w$ 出现的文档数
- 考虑单词的重要性
- 若一个单词在100个文章中出现了90次,那么他的重要性不如只出现了5次的单词
tf-idf.png
one-hot的稀疏性问题 Sparsity
- 真实的词典大小很大
- 所以,一句话的one-hot可能只有几个值不为零
分布式表示方法 Distributed Representation
- 句向量长度是自定义的
distri-repre-len
- Word Similarity
distri-repre-word-simi
- 词向量 word vectors 是分布式表示方法的一种
- 向量容量空间 Capacity
- 100维的one-hot表示法 只能表达 100个单词
- 100维的分布式表示法 能表达 无穷个单词
如何设置词向量
庞大的字符串集合 -> 深度学习模型 -> 训练出的词向量
– 有公开的训练好的词向量资源
word-embedding.png
– 我们希望词向量能代表单词的意思
如何用词向量表达句子
- 平均法则 Average法则
- 每一维取所有词的平均值
- LSTM/RNN 方法