跟着其他博客走的步骤,最后做的不一定对,随便写写,表喷-_-

虽然也没完全弄懂。。

大体步骤是已知A->AB或A->b的概率,对输入的字符串,建立多棵树,最大概率的树即为该字符串的句法树。

首先根据https://blog.csdn.net/bbbeoy/article/details/79649690

里已经推导出的各个产生式的概率

(新注:根据后来的不断实践,图表中的P和IN是同一个)

建立一个二维字典(和ll1和lr1同理)

引用博客给出的算法:

以下用pi表示Π

算法框架:

输入 长度为n的语句单词个数 和 PCFG文法(N:非终结字符集,大埃普西隆:终结字符集 R:产生式规则 S:开始符号)

首先 初始化 对于所有的i取值为1-n 如果存在X->xi(第i个单词)

那么 pi(i,i,X)就为该产生式对应的概率,其他为0,pi(i,j,X)表示单词序列下标i到j的单词段,以X为根的子树的概率,初始化也就是把X->单词的所有概率写入

采用n*n二维数组嵌套一个字典结构,初始化所有值为空字典{}、

执行算法:(根据实际储存对原算法进行修改)

第一层遍历L取值为0到n-2:

第二层遍历i取值为0到n-L-2:

令j为i+L

第三层遍历对于所有的非终结字符X:

初始化最大值为0,取最大值时的参数为-1

第四层遍历s取值为i到j-1:

如果 (X->YZ)的概率乘pi(i,s,Y)乘pi(s+1,j,Z)大于之前的最大值,则更新最大值和最大值参数为当前值

第四层遍历完:把最大值写入pi(i,j,X) 参数写入bp(i,j,X)

[特别像Floyd算法]

输入句子:the man saw the dog with the telescope

实现代码:

# -*- coding: utf-8 -*-
"""
Created on Thu Jan  3 19:58:23 2019@author: 71405
"""
"""
对于字符串中的字符xi和任意非终结字符N
初始化
pi(i,i,N)=N->xi的概率 如果不满足产生式则为0开始
for l=1:n-1for i=1:n-l另 j=i+l对于所有终结符X计算:pi(i,j,X)=max(q(X->YZ)*pi(i,s,Y)*pi(s+1,j,Z))  满足X->YZ且 s取值为i到j-1和bp(i,j,X)=argmax(q(X->YZ)*pi(i,s,Y)*pi(s+1,j,Z))
"""
from collections import defaultdict
import re
def addtwodimdict(thedict, key_a, key_b, val): if key_a in thedict:thedict[key_a].update({key_b: val})else:thedict.update({key_a:{key_b: val}})T=['saw','dog','man','telescope','the','with','in']
I=['SS','VP','NP','PP','VT','VI','NN','DT','IN','PX']
p=dict()
addtwodimdict(p, 'SS', ('NP','VP'), 1.0)
addtwodimdict(p, 'VP', 'VI', 0.4)
addtwodimdict(p, 'VP', ('VT','NP'), 0.4)
addtwodimdict(p, 'VP', ('VP','PP'), 0.2)
addtwodimdict(p, 'NP', ('DT','NN'), 0.3)
addtwodimdict(p, 'NP', ('NP','PP'), 0.7)
addtwodimdict(p, 'PP', ('IN','NP'), 1.0)
addtwodimdict(p, 'VI', 'sleep', 1.0)
addtwodimdict(p, 'VT', 'saw', 1.0)
addtwodimdict(p, 'NN', 'man', 0.7)
addtwodimdict(p, 'NN', 'dog', 0.2)
addtwodimdict(p, 'NN', 'telescope', 0.1)
addtwodimdict(p, 'DT', 'the', 1.0)
addtwodimdict(p, 'IN', 'with', 0.5)
addtwodimdict(p, 'IN', 'in', 0.5)sen="the man saw the dog with the telescope"
ss=re.split(r'[\s]',sen)R1=open('gram3.txt').readlines()# 非终->非终
R2=open('gram4.txt').readlines()#非终->终
i=0
while i<len(R1): #去掉'->'符号R1[i]=R1[i][0:2]+R1[i][4:len(R1[i])-1]i+=1
i=0
while i<len(R2): #去掉'->'符号R2[i]=R2[i][0:2]+R2[i][4:len(R2[i])-1]i+=1"""
pi设置为二维数组内嵌一元字典
bp同理
"""
N=len(ss)
#初始化
pi=[ [{} for i in range(N)] for i in range(N)]
bp=[ [{} for i in range(N)] for i in range(N)]
for i in range(N):for x in I:if x+ss[i] in R2:pi[i][i][x]=p[x][ss[i]]else:pi[i][i][x]=0
l=0
while l<=N-2:i=0while i<=N-l-2:   j=i+l+1for X in I:s=imaxi=0args=-1while s<=j-1:for TAB in R1:if X==TAB[0:2] and len(TAB)==6:Y=TAB[2:4]Z=TAB[4:]maxp=p[X][(Y,Z)]*pi[i][s][Y]*pi[s+1][j][Z]if maxp>maxi:maxi=maxpargs=ss+=1pi[i][j][X]=maxibp[i][j][X]=argsi+=1l+=1print('以第一个字符a开始第二个b为结束的段落以X为根的句法树的概率:')
print("a b X   P")
count=0
q=[ [0 for i in range(3)] for i in range(64)]
root=[]
i=0
while i<N:j=0while j<N:if len(pi[i][j])!=0:for k in pi[i][j]:if pi[i][j][k]!=0 :print(str(i)+' '+str(j)+' '+k+' '+str(pi[i][j][k]))q[count][0]=iq[count][1]=jq[count][2]=pi[i][j][k]count+=1root.append(k)j+=1i+=1"""
def dp(start,end):#返回以start为开始end为结束的字符串的最大pmaxi=0i=0argc=-1while i<count:if q[i][0]==start:if q[i][1]==end:maxq=q[i][2]else:maxq=q[i][2]*dp(q[i][1]+1,end)if maxq>maxi:maxi=maxqi+=1return maxidp(0,7)
"""

把pi打印了一下:

以第一个字符a开始第二个b为结束的段落以X为根的句法树的概率:
a b X   P
0 0 DT 1.0
0 1 NP 0.21
0 4 SS 0.00504
0 7 SS 5.2919999999999995e-05
1 1 NN 0.7
2 2 VT 1.0
2 4 VP 0.024
2 7 VP 0.000252
3 3 DT 1.0
3 4 NP 0.06
3 7 NP 0.0006299999999999999
4 4 NN 0.2
5 5 IN 0.5
5 7 PP 0.015
6 6 DT 1.0
6 7 NP 0.03
7 7 NN 0.1

由第五行得最大概率树的最大概率为5.29*10的负5次方

然后在根据pi和bp进行从下往上建树即可

由于时间关系先不程序实现列树了

有缘补上(一定)

【注:1.

本次编程出现一个错误 :

i=0

j=0

while i<n

while j<n

发现第一个循环只执行i=0一次,原来才发现j=0应该放在while i 内(连续出现两次)

2.读取的gram3和gram4分别为图一左表和右表的产生式(为了方便录入NN等字符)

3.由于刚开始对图一P和NN的不可区分性,导致最后运行结果出现了0-4以SS为根的结果,后来思索了一天也没想出来怎么继续做(以为得出来的都是子树然后……) 刚开始用动态规划做(代码在最后注释,留下就当复习算法了),后来想想不太对,没有考虑规则R的问题………………………………直到最后手动建表发现IN没有其他非终结符能产生!然后查了另外一个图(未附)得出结论:P为IN 于是把gramm3和p表中的P更换为IN  跑出了正确的结果 (太尼玛坑了)

句法分析-基于CKY的PCFG(概率上下文无法语法)相关推荐

  1. 【Python自然语言处理】概率上下文无关文法(PCFG)及神经网络句法分析讲解(图文解释 超详细)

    觉得有帮助或有疑问麻烦点赞关注收藏后评论区私信留言~~~ 一.句法分析 句法分析(syntactic parsing或者parsing)是识别句子包含的句法成分要素以及成分之间的内在关系,一般以句法树 ...

  2. 自然语言处理(NLP)-统计句法分析(CKY算法用于PCFG下的句法分析)

    1.先解释何为CFG及PCFG: 一个栗子: 2.CKY算法(或称CYK算法) "在计算机科学领域,CYK算法(也称为Cocke–Younger–Kasami算法)是一种用来对 上下文无关文 ...

  3. 第十四篇:有概率的上下文无关语法Probabilistic Context-Free Grammar

    目录 解析中的歧义 大纲 概率CFGs的基本Basics of Probabilistic CFGs (PCFGs) 使用 PCFG 随机生成 一棵树的可能性有多大? PCFG parsing CYK ...

  4. 基于灰狼算法优化概率神经网络PNN的分类预测-附代码

    基于灰狼算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于灰狼算法优化概率神经网络PNN的分类预测 - 附代码 1.PNN网络概述 2.变压器故障诊街系统相关背景 2.1 模型建立 3. ...

  5. python基于模型的预测概率和标签信息可视化ROC曲线、编写自定义函数计算约登值、寻找最佳阈值(threshold、cutoff)、可视化ROC曲线并在曲线中标记最佳阈值及其数值标签

    python基于模型的预测概率和标签信息可视化ROC曲线.编写自定义函数计算约登值.寻找最佳阈值(threshold.cutoff).可视化ROC曲线并在曲线中标记最佳阈值及其数值标签 目录

  6. 第十三篇:上下文无关语法 Context-Free Grammar

    目录 回顾 上下文无关语法基础 为什么是"上下文无关" Context-Free上下文无关 vs. Regular 常规/正则 CFG 解析 这意味着什么? 但是 大纲 组成部分 ...

  7. 【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )

    文章目录 I . 下推自动机 设计 II . 上下文无关语法 ( CFG ) 等价于 下推自动机 ( PDA ) I . 下推自动机 设计 设计下推自动机 , 可以识别 {wwR:w∈{0,1}∗}\ ...

  8. 【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )

    文章目录 I . 代数表达式 语法 II . 代数表达式 语法 示例 III . 设计 上下文无关语法 IV . 确定性有限自动机 DFA 转为 上下文无关语法 I . 代数表达式 语法 1 . 代数 ...

  9. 【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )

    文章目录 I . 语法组成 II . 规则 III . 语法 IV . 语法示例 V . 语法简写形式 VI . 语法分析树 VII . 代数表达式 语法 I . 语法组成 上下文无关语法 组成 : ...

最新文章

  1. cpp map 获取所有 key_Flutter 中最熟悉的陌生人之 Key 全面解析
  2. Shell脚本中的并发(2)
  3. 摄像头自动曝光相关基础知识
  4. ExecutorService——shutdown方法和awaitTermination方法
  5. 鸿蒙第一款手机,拿下“国内第一手机商”的OPPO,打算弃用华为鸿蒙?
  6. 作者:冷芳玲(1978-),女,博士,东北大学计算机科学系讲师
  7. 李飞飞点赞!,刚刚公布了第一批数据集benchmark入围名单
  8. 《江南》、乌镇、《似水年华》
  9. java 反射 速度_Java 反射获取类方法速率和实现方式
  10. S5PV210 的IIC是四路还是三路的?原来内置一路IIC啊!
  11. 盘点2017年科技事件 马云最娱乐雷军最傲娇
  12. c语言实验二实验报告,C语言实验报告(二)
  13. 区块链开源代码什么意思_区块链可以从开源中学到什么
  14. python 余弦值,Python求向量的余弦值操作代码示例
  15. 下载英文电子书网站,推荐
  16. 小公司个人技术成长路线思考
  17. apache-apr问题
  18. Docker【部署 02】可视化工具DockerUI和Shipyard安装使用实例
  19. 如何写出优秀的单元测试
  20. 学生为什么要学python_碎碎念|为什么要学Python

热门文章

  1. 自制COREXY结构的3D打印机
  2. PyTorch入门学习-4.自然语言分类任务
  3. 医药行业销售过程管理系统解决方案
  4. 河工大邮箱申请,jetbrains学生邮箱申请,ideaIU版本下载、激活
  5. 如何在LR中导入预设
  6. 【生成密钥免密登陆服务器】
  7. springboo集成bboss-elasticsearch实现elasticsearch客户端
  8. 统计建模与R软件 薛毅 陈立萍 清华大学出版社第四章课后答案
  9. 苹果 开发者账号如下
  10. python编程处理excel数据_python实现对excel进行数据剔除操作实例