自然语言处理NLP训练营笔记 Day02

闲谈 Digressions

   
   

@ZYX 写于2020年08月24日

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

  • 步骤
    1. 输入
    2. 生成所有的分割
    3. 通过工具,选择最好的分割 (例如语言模型)
  • 概率过小问题
    有时候会出现概率是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

  • 两类错误
    • 错别字,字母错误
    • 语法上错误 (如时态)
  • 修正方法
    1. insert
    2. delete
    3. replace
  • 编辑距离 edit distance
    • 对于一个input,在所有候选方案candidates中,选择编辑距离最小的方案
    • 使用DP

Alternative Way

  • 步骤
    1. 用户输入
    2. 生成编辑距离为1或2的字符串
      • 为什么只生成这些字符串?
        因为用户出错大多在这个范围之内
    3. 过滤
      • 如何过滤?
        • 问题定义
          给定一个字符串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得出
    4. 返回

停用词过滤 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 方法