分词 Segmentation
分词可以认为是已经解决的问题
分词工具 Segmentation Tools
Jieba分词 : https://github.com/fxsjy/jieba
SnowNLp : https://github.com/isnowfy/snownlp
LTP : http://www.ltp-cloud.com/
HanNLP : https://github.com/hankcs/HanLP/
分词方法 Segmentation Method
1. 基于匹配规则的方法—Max Matching(最大匹配)
前项最大匹配(forward-max matching):从前向后扫描max_len的长度
后向最大匹配 (backward-max matchine):从后向前扫描max_len的长度
最大匹配的缺点:
- 细分(有可能是更好)
- 局部最优
- 效率低(※)
- 歧义(不能考虑语义)
PS:
1. 两种匹配方法结果90%会一样
2. 算法分为:贪心算法:选择当前最好解,不能看到全局最优解、DP算法:Global Optional
3. 这是贪心算法
2. 基于概率统计的方法—Language Model
(LM、HMM、CRF...)
Incorporate Semantic(考虑语义)
step1: 输入
<——生成所有可能的分割——>
step2: 选择其中最好的(by LM)
PS:1. 缺点: 复杂度很高,计算效率低
2. 对于underflow(相乘结果小数点太多溢出问题)的解决办法 :“P——>logP”
3. 维特比算法(※)
合并step1和step2,解决计算效率低问题
动态规划问题,LM依赖Unigram
Steps:
所有单词串联
combine所有出现过的词汇,进行连线
-
统计所有路径
从连线开始到结束的所有路径即为“分词”时的所有路径
-
计算:最小(-logP)路径 <=> 最大(logP)路径
- P: 句子的概率。eg:P(今天真高兴) = 0.35
数学公式表示维特比算法
- f(m) = min { f(i) + W(i,m) }
- i ∈ Ω(m)
- Ω(m) : all the imcoming links
- f(i) : 从节点1到节点 i 的最短路径的值
斐波那契: f(n) = f(n-1) + f(n-2)
Spell Correction 拼写错误纠正
(搜索相关)
用户输入(input)
<—AI—>
用户输入(correction)
1.错别字,2.词义不合适
触发机制:1:不存在于词典库 2:LM,P值很低 or...
Progess
- 当前单词 —(edit distance)—> find all Candidates
- 过滤掉不存在词库里的词—> Candidates
- -(NoisyChannel)-> Answer corrected
- C^= argmaxc∈candidateP(S|C)* P(C)
- P(S|C):从历史日志获得
- P(C):LM获得
计算编辑距离的方法
初始方法:
input ——> find min(edit distance) ——> return Candidates
复杂度高O(V),V:字典中的所有词
- 计算 edit distance(基于DP算法)
- 3 operators : insert、delete、replace
- 操作即成本
- 操作数越小,成本越小,edit distance 就越小
alternative way(优化):
-
input —> 生成编辑距离为1,2 的字符串 —> 过滤 —> return
- 生成过程By"replace/add/delete"三种操作
- 之所以选定edit distance为1,2是科学论定,可以覆盖99.9%的情况`
-
停用词过滤
-
How to select?
- 问题定义:给定一个字符串S,we should find out 最有可能成为正确的字符串C,即:
-
C^ = argmaxc∈candidateP(C|S) = argmaxc∈candidateP(S|C)* P(C)/P(S) = argmaxc∈candidateP(S|C)* P(C)
可以理解成: x^ = argmaxxf(x),即寻找一个x值使f(x)最大,将其定义为x^
此公式可参考贝叶斯定理:P(x|y)=P(y|x)*P(x)/P(y)
P(x,y):联合概率,P(x|y):条件概率- 分析:由于S给定,C的选取改变不受P(S)影响,故P(S)可看做常数
- P(C)如何计算?——历史数据。P(C) : Unigram probability
- P(S|C):对于一个正确的字符串(C),有百分之杜鳌少的人写成了S (input) 的形式
-
- 问题定义:给定一个字符串S,we should find out 最有可能成为正确的字符串C,即:
-
Filtering Words
- 过滤:停用词(考虑特殊应用场景)、出现频率很低的词汇
- 过滤过程类似于特征筛选,过滤后得到一个词典库
-
Stemming:one way to normalize词的标准化操作
- 把相同意思的单词合并,多用于英文
- Stemming不保证合并后的单词是有效单词
- lemmazation方法相对于Stemming更加严格,输出为有效单词
- PorterStemmer算法:https://tartarus.org/martin/PorterStemmer/java.txt
- 语言学家指定了Porter Stemmer规则
-
文本表示
Word Repressentation 向量表示单词
-
one-hot representation 方法
词典:[我们,去,爬山,今天] word表示: 我们:(1,0,0,0) 今天:(0,0,0,1) sentence表示: 去爬山:(0,1,1,0) 我们去爬山去:(1,1,1,0)
Sentence Representation 向量表示句子
-
boolean representation 方法
- 词典中的词出现次数大于1,仍记为1,出现0次记为0
-
count-based representation 方法
- 词典中的词出现n次,仍记为n,出现0次记为0
- 并不是出现次数越多就越重要,越少就越不重要,反而是经常相反
-
tf-idf Representation 方法
tfidf(w) = tf(d,w) * idf(w)
- tf: 文档d中w的词频
- idf: log(N/N(w)),用于考虑单词的重要性
- N: 预料库中的文档总数
- N(w): 词语w出现在多少个文档
- 计算的pipeline
- 由句子构建词典
文本相似度
Sentence Similarity
- 计算距离(欧氏距离):d = |s1 -s2|
- d越大,相似度越小
- 计算相似度(余弦相似度):d = (s1·s2)/(|s1|*|s2|)
- d = 内积(方向)/范数(大小)Normalization
- 可以同时考虑方向、大小
- d越大,相似度越高
Word2Vector词向量
Words Similarity
-
one-hot representation
- 不能表达单词之间的语义相似度
- Sparsity
- 向量长度=词典维度
-
Distributed Representation
- 向量长度自定义
- 不稀疏,每个向量元素都不是0
Comparing the Capacities
- 100维的One-Hot 表示法做多可以表达100个单词
- 100维的分布式 表示法做多可以表达无穷多个单词
- 因此分布式表示法的容量空间远远大与one-hot
Learn Word Embeddings
Input(string) ——> 深度学习模型 ——> Distributed Representation
- 1B: string contains 10^9 tokens(单词)
- 训练词向量的深度学习模型:skip-gram、Glowe、CBOW、RNN/LSTM、MF、Gaussian Embedding
- 所有模型提前需要定好参数-维度:dim/D:100/200/300(or so ,一般不超过300维)
- 多数公司词向量已经训练好,直接使用
Essence of Word Embedding
Word2Vec 某种意义上理解成词的意思(Meaning)
训练词向量时,可以将训练结果放到二维空间,看二维空间中的词是否有一些分类的特点
From Word Embedding to Sentence Embedding
- Averaging法则: 计算出句子向量,再根据相似度计算方法计算两个句子的相似度
Inverted Index倒排表
Retrieval-based QA System
input ——> 与知识库相似度匹配 ——> 返回相似度最高的
- 时间复杂度很高O(N)
- 计算相似度= O(N)*Sim(str1,str2)
优化—解决以上时间复杂度高的问题,核心思想“层次过滤思想”
input ——>过滤1 ——> 过滤2(多层过滤)——> 相似度匹配算法(cosin-similarity)——> return
时间复杂度:过滤器1 < 过滤器2 < cosin-similarity算法