• 1 中文数据预处理

    • a. 中文分词预处理
    • b. 用正则表达式,对特殊类型进行泛化,比如:数字,时间,日期,网址等等
    • c. 组织机构的名词不捆绑,为了信息抽取更方便,比如同济大学土木工程学院拆分成"同济大学"和"土木工程学院"更合理
  • 2 英语数据预处理
    • a. 将所有的大写字母改为小写
    • b. 将符号与单词用空格隔开
    • c. 与1中b处理一样
  • 3 词对齐算法(工具,GIZA++)
  • 4 短语翻译表构造(短语抽取,概率估计)
  • 5 解码(Beam Search)

Note:还有全角字符转化成半角字符,同一类型泛化名字最好一致等等

  • Ext 1: 中文分词

    • 结巴分词(直接分析源码吧):

a. 基于前缀字典的动态规划分词

jieba.cut(self, sentence, cut_all=False, HMM=True, use_paddle=False);'''
当cut_all = False, HMM = FALSE, 执行的是基于前缀词典的动态规划分词
FREQ是词典,三元组(词,词频,词性)样子如下:
AT&T 3 nz
B超 3 n
c# 3 nz
C# 3 nz
c++ 3 nz
C++ 3 nzget_DAG 得到有向无环图
calc 动态规划计算最大的概率,route[i]表示best(0:i) + best(i + j) + best(j:)中j的值
'''
def get_DAG(self, sentence):self.check_initialized()DAG = {}N = len(sentence)for k in xrange(N): # 逆序计算tmplist = []i = kfrag = sentence[k]while i < N and frag in self.FREQ:if self.FREQ[frag]:tmplist.append(i)   # 建立有向边,逆向建立i += 1frag = sentence[k:i + 1]if not tmplist:tmplist.append(k)DAG[k] = tmplistreturn DAG# 计算最佳路径,类似dijstra
def calc(self, sentence, DAG, route):N = len(sentence)route[N] = (0, 0)logtotal = log(self.total)for idx in xrange(N - 1, -1, -1):   # 反向计算route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -logtotal + route[x + 1][0], x) for x in DAG[idx])# 切分主程序
def __cut_DAG_NO_HMM(self, sentence):DAG = self.get_DAG(sentence)route = {}self.calc(sentence, DAG, route)x = 0N = len(sentence)buf = ''while x < N:y = route[x][1] + 1     # 查找结果l_word = sentence[x:y]if re_eng.match(l_word) and len(l_word) == 1:    # 对于纯字母和数字处理buf += l_wordx = yelse:if buf:yield bufbuf = ''yield l_wordx = yif buf:yield bufbuf = ''

b. HMM模型
当cut_all = False, HMM = True时,利用的是基于HMM的分词,使用的是viterbi算法。
HMM模型转化为λ=(A,B,π)\lambda = (A, B, \pi)λ=(A,B,π) 状态序列为I,对应的观测序列为O,对于这三个基本参数,HMM有以下经典问题

  • 概率计算问题,在模型λ\lambdaλ下观测序列O出现的概率
  • 学习问题,已知观测序列O,估计模型参数λ\lambdaλ,是的该模型下观测序列P(O∣λ)P(O|\lambda)P(O∣λ)最大
  • 解码问题,已知模型λ\lambdaλ与观测序列O,求解条件概率P(I∣O)P(I|O)P(I∣O)最大的状态序列

此分词是第三个经典问题,该模型转化为已知状态集合Q=[“BMES”],λ\lambdaλ由样本训练得到,观测序列为对应的汉字序列,求解最大概率的状态序列I。

假设序列为C = “我们一起去打羽毛球”,状态序列为T=[“B”,“M”,“E”,“S”],即求条件概率:
max⁡P(t1,...,tn∣c1,...,cn)\max P(t_1, ..., t_n | c_1, ..., c_n)maxP(t1​,...,tn​∣c1​,...,cn​)
有限历史性假设:
P(ti∣ti−1ti−2...t1)=P(ti∣ti−1)P(t_i|t_{i-1}t_{i-2}...t_1) = P(t_i|t_{i-1})P(ti​∣ti−1​ti−2​...t1​)=P(ti​∣ti−1​)
独立输出假设:
P(c1,...,cn∣t1,...tn)=P(c1∣t1)P(c2∣t2),...,P(cn∣tn)P(c_1,...,c_n|t_1,...t_n)=P(c_1|t_1)P(c_2|t_2),...,P(c_n|t_n)P(c1​,...,cn​∣t1​,...tn​)=P(c1​∣t1​)P(c2​∣t2​),...,P(cn​∣tn​)
所以条件概率转化为:
max⁡P(t1,...,tn∣c1,...,cn)\max P(t_1, ..., t_n | c1, ..., c_n)maxP(t1​,...,tn​∣c1,...,cn​)等价于max⁡P(c1,...,cn∣t1,...,tn)P(t1,...,tn)\max P(c_1, ..., c_n|t_1,...,t_n)P(t1,...,t_n)maxP(c1​,...,cn​∣t1​,...,tn​)P(t1,...,tn​)
根据上面的两个假设,转化为:
max⁡P(c1,...,cn∣t1,...,tn)P(t1,...,tn)=max⁡P(c1∣t1)P(t1)P(c2∣t2)P(t2)P(t2∣t1),...,P(cn∣tn)P(tn)P(tn∣tn−1)\max P(c_1,...,c_n|t_1,...,t_n)P(t_1,...,t_n)=\max P(c_1|t_1)P(t_1)P(c_2|t_2)P(t_2)P(t_2|t_1),...,P(c_n|t_n)P(t_n)P(t_n|t_{n-1})maxP(c1​,...,cn​∣t1​,...,tn​)P(t1​,...,tn​)=maxP(c1​∣t1​)P(t1​)P(c2​∣t2​)P(t2​)P(t2​∣t1​),...,P(cn​∣tn​)P(tn​)P(tn​∣tn−1​)
代码如下:

jieba.cut(self, sentence, cut_all=False, HMM=True, use_paddle=False);'''
当cut_all = False, HMM = True, 执行的是viterbi算法,用于分词
'''
# 切分主程序
def __cut_DAG(self, sentence):DAG = self.get_DAG(sentence)route = {}self.calc(sentence, DAG, route)x = 0buf = ''N = len(sentence)while x < N:y = route[x][1] + 1l_word = sentence[x:y]if y - x == 1:      # 只有一个字符buf += l_wordelse:if buf:if len(buf) == 1:yield bufbuf = ''else:# 不是词典中的词即词频为0,按照Viterbi切分if not self.FREQ.get(buf):  recognized = finalseg.cut(buf)  for t in recognized:yield telse:for elem in buf:yield elembuf = ''yield l_wordx = yif buf:if len(buf) == 1:yield bufelif not self.FREQ.get(buf):recognized = finalseg.cut(buf)for t in recognized:yield telse:for elem in buf:yield elem# viterbi算法
# start_p: start概率,即P(t_i)
# trans_p: 转化矩阵,状态从t_i转化为t_j
# emit_p:  发射矩阵,在状态t_i下的值为o_i
def viterbi(obs, states, start_p, trans_p, emit_p):V = [{}]  # tabularpath = {}for y in states:  # initV[0][y] = start_p[y] + emit_p[y].get(obs[0], MIN_FLOAT)path[y] = [y]for t in xrange(1, len(obs)):V.append({})newpath = {}for y in states:em_p = emit_p[y].get(obs[t], MIN_FLOAT)(prob, state) = max([(V[t - 1][y0] + trans_p[y0].get(y, MIN_FLOAT) + em_p, y0) for y0 in PrevStatus[y]])V[t][y] = probnewpath[y] = path[state] + [y]path = newpath(prob, state) = max((V[len(obs) - 1][y], y) for y in 'ES')return (prob, path[state])# HMM切分算法
def __cut(sentence):global emit_Pprob, pos_list = viterbi(sentence, 'BMES', start_P, trans_P, emit_P)begin, nexti = 0, 0# print pos_list, sentencefor i, char in enumerate(sentence):pos = pos_list[i]if pos == 'B':begin = ielif pos == 'E':yield sentence[begin:i + 1]nexti = i + 1elif pos == 'S':yield charnexti = i + 1if nexti < len(sentence):yield sentence[nexti:]
  • Ex2: 评价标准

    • a. 人工评价(打分制)
    • b. F值(正确率,召回率)
      正确率P=正确长度目的串长度;召回率R=正确长度源串长度正确率 P= \frac {正确长度}{目的串长度}; \quad 召回率R= \frac {正确长度}{源串长度}正确率P=目的串长度正确长度​;召回率R=源串长度正确长度​
      F=2∗P∗RP+RF=\frac{2*P*R}{P+R}F=P+R2∗P∗R​
    • c BELU(更通用)
      BLEU(score)=BP∗exp⁡(∑n=1Nwnlog⁡pn)BLEU(score)=BP*\exp (\sum_{n=1}^{N}w_n\log p_n)BLEU(score)=BP∗exp(n=1∑N​wn​logpn​)
      其中,
      BP={1,c > re(1−cr),c≤r,wn=1N,c表示output长度,r表示reference长度BP= \begin{cases} 1, &\text {c > r} \\ e^{(1-\frac {c}{r})}, & \text c \leq r \ \end {cases} ,\quad w_n = \frac {1}{N}, \quad c表示output长度,r表示reference长度BP={1,e(1−rc​),​c > rc≤r ​,wn​=N1​,c表示output长度,r表示reference长度
      取对数,得到
      BELU^=min⁡(0,1−cr)+(∑n=1Nwnlog⁡pn)\hat{BELU} = \min(0, 1 - \frac {c}{r}) +(\sum_{n=1}^{N}w_n\log p_n)BELU^=min(0,1−rc​)+(n=1∑N​wn​logpn​)

基于统计的机器翻译(SMT)相关推荐

  1. NLP——8.基于统计的翻译系统

    基于统计的机器翻译:mosesdecoder作为比对翻译效果的baseline,如果不如这个的效果,就说明测试系统效果不算好. 首先看看一共需要以下三个模型: 语言模型:用来评估这句话的通畅程度. 1 ...

  2. 基于PaddlePaddle的机器翻译教程 | 深度学习基础任务系列

    https://www.toutiao.com/a6699979989980283404/ 本文转载自PaddlePaddle 量子位 编辑 | 公众号 QbitAI 机器翻译(machine tra ...

  3. 基于规则经验主义和基于统计的自然语言处理方法的比较

    这学期为了逼着自己学,选了门NLP的课,之前一直没了解过,上了两次课后让写点看法,不才写就此文.就权当我为这门课攒个人品啦! /************************************ ...

  4. kaggle信用卡欺诈看异常检测算法——无监督的方法包括: 基于统计的技术,如BACON *离群检测 多变量异常值检测 基于聚类的技术;监督方法: 神经网络 SVM 逻辑回归...

    使用google翻译自:https://software.seek.intel.com/dealing-with-outliers 数据分析中的一项具有挑战性但非常重要的任务是处理异常值.我们通常将异 ...

  5. 3d激光雷达开发(基于统计滤波)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 基于统计方法的滤波其实是比较好理解的.也就是说,在一个局部范围内,选择距离最近的几十个点,要求他 ...

  6. 《中国人工智能学会通讯》——6.16 基于统计的推理方法

    6.16 基于统计的推理方法 前面提到,知识图谱中基于统计的推理方法一般指关系机器学习方法,一个比较好的综述论文可以参考文献 [17].下面介绍一些典型的方法. 实体关系学习方法 实体关系学习的目的是 ...

  7. 基于统计学习---面向新闻的发生地与提及地检测

    基于统计学习---面向新闻的发生地与提及地检测 一.摘要 二.流程 2.1- 数据构建及数据预处理 2.2- 全国5级地址实体二叉树 2.3- 命名实体识别相关算法 2.4- 新闻中特征信息分析 2. ...

  8. 中文分词算法——基于统计的分词

    1.基于统计的分词(无字典分词) 主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词.因此字与字相邻出现的概率或频率能较好的反映词的可信度. 主要统计模型为:N元文法模型(N-gram ...

  9. 基于统计复用的分组交换网络拥塞控制的科普解释

    原文链接:https://blog.csdn.net/dog250/article/details/53138144 最近收到很多邮件咨询各种问题,一般而言我能回答的就都回答了,我自有自知之明,绝不是 ...

最新文章

  1. Unity 2D游戏开发快速入门(内部资料)
  2. Flask之DButils
  3. Go Language 开发环境搭建
  4. 学习SpringMVC——从HelloWorld开始
  5. 分享 - 普通程序员如何转向AI方向
  6. python3线程gil_python3爬虫GIL修改多线程实例讲解
  7. 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)
  8. python基础技巧总结(四)
  9. NLP复习资料(5)-第九章 句法分析
  10. php设置用户头像,PHP针对多用户实现更换头像功能
  11. MySQL基础篇(07):用户和权限管理,日志体系简介
  12. jquery ajax 方法及各参数详解
  13. 数据结构C语言版第二版(名师严蔚敏最新力作)人民邮电出版社
  14. LG手机无法连接adb
  15. 优酷KUX视频转换MP4工具,纯个人向分享
  16. jenkins 使用报ERROR: svn: E155010: The node ‘/aaa/bbb/ccc/ddd‘ was not found.
  17. h5倒计时弹窗_H5活动开始/结束倒计时实现
  18. 基于CANOpen协议驱动直流无刷减速电机
  19. 2018天池比赛首战落幕
  20. 30个计算机相关的英语词汇,计算机应用常用英语词汇30

热门文章

  1. 宏内核与微内核、Linux内核与Unix内核的区别
  2. 在SHP, DWG, DXF, KML/KMZ矢量数据中自由行走
  3. 剑指Offer(43)1~n整数中1出现的次数
  4. linux中进入目录命令是什么,linux进入目录的命令是什么
  5. BFC的形成条件以及作用
  6. 服务端性能测试-为什么一般性能测试都是在局域网中进行的
  7. SAP ABAP 业务对象 BUS1138 StatisticKeyFigureCO CO 统计指数 BAPI 清单和相关 TCODE
  8. Python获取wind财务数据
  9. Android Studio应用开发简介
  10. 计算机应用研究增刊征稿,计算机应用研究增刊_计算机应用_计算机工程与应用增刊...