关于这两个算法的定义请自行百度我这里讲一下我自己的运用的nlp场景以及在这个nlp场景下各自的不同:
首先这两个算法都是我都是用来处理指数级的排列组合(全部序列进行笛卡尔积组合)(时间复杂度N**M) , 而维特比 和beam search 算法 (时间复杂度N*N*M)
注:M为序列的长度 N为我们的状态集合的大小 这里面beam search 是要比我们维特比稍微快一点的 因为 这里面 N在维特比中是全部的状态的集合 而在beamsearch 中 N为 topN
例如:有一个文本序列 w1,w2,.......,wn 对应的状态为s1,s2,.....sn 。为什么要有这两个东西,可以理解为一个是我们能观察到的东西,另一个为我们任务所需要求解的东西。
这里我用到的具体场景为nlp 的NER 、文本生成、文本纠错 !
beam search 算法步骤:
这里面我才用的x=[] 来存储 每一步最优解
1.每一个状态的进行筛选出topN 的候选集 x.append(topN候选集)
2.然后x.pop()与下一个状态的集合进行笛卡尔积的组合筛选出topN 再 x.append(topN候选集)
3.循环直到结束
这里我想说的比较符合人的正常逻辑想法 ,这里是局部最优解得不到全局最优解
这里面我以文本纠错为例进行:
sentence_error="我想进行前倒" sentence_correct="我想进行签到" 通过ngram 定位到“前倒” 这个字有问题 我这边通过同音或近音候选找到两个字的候选集,然后进行beamsearch 填充
def _confusion_word_set(self, word,before_sent, after_sent,mem):
"""
:param word: 定位到的词
:param before_sent: 当前位置的前文
:param after_sent: 当前位置的后文
:param mem: 上一个文字修改的最有集合
:return:
"""
confusion_word_set=set()
candidate_wordss1=[]
candidate_word_dicts={}
#同音词的筛选出来
same_pinyin=[]
try:
me = mem.pop()
except:
try:
same_pinyin.append(self.s