NLP1

流程(Pipeline)

NLP数据预处理的流程:

  • 浏览原始文本(raw data)
  • 分词(segmentation)
  • 清洗(cleaning)
  • 标准化(normalization)
  • 特征提取(feature extraction)
  • 建模(modelling)

分词

常用的分词工具:

  • jieba分词
  • snow NLP
  • LTP
  • HanLP

分词方法1: 最大匹配法

最大匹配法:max matching。最大匹配法可以细分为三种:前向最大匹配、后向最大匹配和双向最大匹配

注意

  • 不论采用哪种分词方法都是需要使用到词典的。
  • 最大匹配法是贪心算法,在每一步都会选择当前最优解,但是不能够保证全局最优。

缺点

  • 不能够细分(优先匹配长词汇,但是细分的结果有可能更优)
  • 局部最优解,不能保证全局最优
  • 效率比较低(如果将max_len设置的比较大)
  • 不会考虑语义

a. 前向最大匹配

前向最大匹配:forward-max matching。
例子:我们经常有意见分歧。
词典:【“我们”,“经常”,“有”,“有意见”,“分歧”,“意见”】

  1. 定义超参数max_len。此处我们假设为5。
  2. 提取句子中的前5个字【我们经常有】并比对字典,发现没有词汇与其匹配。
  3. 提取句子中的前4个字【我们经常】并比对字典,发现没有词汇与其匹配。
  4. 提取句子中的前3个字【我们经】并比对字典,发现没有词汇与其匹配。
  5. 提取句子中的前2个字【我们】并比对字典,发现词典中有对应的词汇与之对应,提取改词。
  6. 从“经常”开始,重复2-5,直到例子中的所有词汇被提取完。

最后分词的结果是【“我们”,“经常”,“有意见”,“分歧”】。由此可以我们是希望所匹配到的单词越越好。

b. 后向最大匹配

后向最大匹配:backward-max matching。
后向最大匹配类似于前向最大匹配,只不过它是由后向前匹配。
例子:我们经常有意见分歧。
词典:【“我们”,“经常”,“有”,“有意见”,“分歧”,“意见”】

  1. 定义超参数max_len。此处我们假设为5。
  2. 提取句子中的后5个字【有意见分歧】并比对字典,发现没有词汇与其匹配。
  3. 提取句子中的后4个字【意见分歧】并比对字典,发现没有词汇与其匹配。
  4. 提取句子中的后3个字【见分歧】并比对字典,发现没有词汇与其匹配。
  5. 提取句子中的后2个字【分歧】并比对字典,发现词典中有对应的词汇与之对应,提取改词。
  6. 从“经常”开始,重复2-5,直到例子中的所有词汇被提取完。

最后分词的结果是【“我们”,“经常”,“有意见”,“分歧”】。我们仍然希望所匹配到的单词越越好。
注意前向最大匹配和后向最大匹配的分词结果通常都是一样的。

分词方法2: 考虑语义

考虑语义:incorporate semantics。我们这里所考虑的语义是相对比较简单的语义。
例子:经常有意见分歧。
词典:【“经常”,“有”,“有意见”,“分歧”,“意见”】
步骤:

  • 输入句子;
  • 生成所有可能的类别;
    *经常|有意见|分歧
    *经常|有|意见|分歧
    *经|常|有|意|见|分|歧
    *…
  • 选择其中工具认为最好的。

注:我们讲的工具是指语言模型(language model),通过输入不同的分词结果,它会返回相应分词的概率值,我们通常会选择概率值最大的分词结果。简而言之,语言模型可以预测一组词出现的概率。

Unigram语言模型

Unigram语言模型:假设每个词都是独立的,即
P ( A , B ) = P ( A ) ∗ P ( B ) P(A, B)=P(A)*P(B) P(A,B)=P(A)P(B)
注意Unigram是N-gram的一种,N-gram考虑了N个词的前后顺序。这里我们用例子来说明Unigram和bigram。
N-gram的解释和实现

例子:
S1: 经常|有意见|分歧
S2: 经常|有|意见|分歧

Unigram
P ( 经 常 , 有 意 见 , 分 歧 ) = P ( 经 常 ) ∗ P ( 有 意 见 ) ∗ P ( 分 歧 ) P(经常, 有意见, 分歧)=P(经常)*P(有意见)*P(分歧) P(,,)=P()P()P()

Bigram
P ( 经 常 , 有 意 见 , 分 歧 ) = P ( 经 常 ) ∗ P ( 有 意 见 ∣ 经 常 ) ∗ P ( 分 歧 ∣ 有 意 见 ) P(经常, 有意见, 分歧)=P(经常)*P(有意见|经常)*P(分歧|有意见) P(,,)=P()P()P()

**注意:**这里每个词的概率是我们使用统计的方法预先得到的。譬如让机器通过它的方式阅读一本书,然后可以得出相应的每个词的概率。但有一个问题是由于词汇量比较大,所以每个词汇出现的概率比较小,乘积会导致underflow现象(即乘积为-inf),所以我们一般进行log变换,比较log变换之后的和。

存在的问题

  • 复杂度高。在汉语中,每个汉字都可以被分离出来,所以导致生成的组合太多,所以效率比较低。

怎么解决效率问题?

  • 使用维特比算法。

维特比算法

维特比算法:viterbi。维特比算法的本质是动态规划问题。
continued…理解和python代码的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值