NLP文本处理

分词 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

  1. 当前单词 —(edit distance)—> find all Candidates
  2. 过滤掉不存在词库里的词—> Candidates
  3. -(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) 的形式
    • Filtering Words

      • 过滤:停用词(考虑特殊应用场景)、出现频率很低的词汇
      • 过滤过程类似于特征筛选,过滤后得到一个词典库
    • Stemming:one way to normalize词的标准化操作

      1. 把相同意思的单词合并,多用于英文
      2. Stemming不保证合并后的单词是有效单词
      3. lemmazation方法相对于Stemming更加严格,输出为有效单词
      4. PorterStemmer算法:https://tartarus.org/martin/PorterStemmer/java.txt
      5. 语言学家指定了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算法

你可能感兴趣的:(NLP文本处理)