PCFG CKY实现--python版本

【自然语言处理】CKY 算法实战:从数学推导到Python实现句法分析 本文详细介绍了CKY算法在自然语言处理中的句法分析应用,从数学原理到Python实现全面解析。CKY算法作为Cocke–Kasami–Younger Algorithm的经典实现,通过动态规划和乔姆斯基范式高效解析句子结构,适用于Python环境下的批量处理与可视化分析。 阅读详情
class PCFG(object):
    def __init__(self, non_ternimal, terminal, rules_prob, start_prob):
        self.non_terminal = non_ternimal
        self.terminal = terminal
        self.rules_prob = rules_prob
        self.start_symbol = start_prob


    def parse_sentence(self, sentence):
        sents = sentence.split()
#         best_path = [[{}]*len(sents)]*len(sents)    # Error!! 共享同一块内存区域!!
        best_path = [[{} for _ in range(len(sents))] for _ in range(len(sents))]

        # initialization
        for i in range(len(sents)):
            for x in self.non_terminal:
                best_path[i][i][x] = {}
                if (sents[i],) in self.rules_prob[x].keys():
                    best_path[i][i][x]['prob'] = self.rules_prob[x][(sents[i],)]
                    best_path[i][i][x]['path'] = {'split':None, 'rule': sents[i]}
                else:
                    best_path[i][i][x]['prob'] = 0
                    best_path[i][i][x]['path'] = {'split':None, 'rule': None}

        # CKY recursive
        for l in range(1, len(sents)):
            for i in range(len(sents)-l):
                j = i + l
                for x in self.non_terminal:
                    tmp_best_x = {'prob':0, 'path':None}
                    for key, value in self.rules_prob[x].iteritems():
                        if key[0] not in self.non_terminal: 
                            break
                        for s in range(i, j):
                            tmp_prob = value * best_path[i][s][key[0]]['prob'] * best_path[s+1][j][key[1]]['prob']
                            if tmp_prob > tmp_best_x['prob']:
                                tmp_best_x['prob'] = tmp_prob
                                tmp_best_x['path'] = {'split': s, 'rule': key}
                    best_path[i][j][x] = tmp_best_x
        self.best_path = best_path

        # parse result
        self._parse_result(0, len(sents)-1, self.start_symbol)
        print "prob = ", self.best_path[0][len(sents)-1][self.start_symbol]['prob']


    def _parse_result(self, left_idx, right_idx, root, ind=0):
        node = self.best_path[left_idx][right_idx][root]
        if node['path']['split'] is not None:
            print '\t'*ind, (root, self.rules_prob[root].get(node['path']['rule']))
            self._parse_result(left_idx, node['path']['split'], node['path']['rule'][0], ind+1)
            self._parse_result(node['path']['split']+1, right_idx, node['path']['rule'][1], ind+1)
        else:
            print '\t'*ind, (root, self.rules_prob[root].get((node['path']['rule'],))), 
            print '--->', node['path']['rule']



def main():
    non_terminal = {'S', 'NP', 'VP', 'PP', 'DT', 'Vi', 'Vt', 'NN', 'IN'}
    start_symbol = 'S'
    terminal = {'sleeps', 'saw', 'man', 'woman', 'dog', 'telescope', 'the', 'with', 'in'}
    rules_prob = {'S': {('NP', 'VP'): 1.0},
                  'VP': {('Vt', 'NP'): 0.8, ('VP', 'PP'): 0.2},
                  'NP': {('DT', 'NN'): 0.8, ('NP', 'PP'): 0.2},
                  'PP': {('IN', 'NP'): 1.0},
                  'Vi': {('sleeps',): 1.0},
                  'Vt': {('saw',): 1.0},
                  'NN': {('man',): 0.1, ('woman',): 0.1,('telescope',): 0.3,('dog',): 0.5},
                  'DT': {('the',): 1.0},
                  'IN': {('with',): 0.6, ('in',): 0.4},
                }
    pcfg = PCFG(non_terminal, terminal, rules_prob, start_symbol)
    sentence = "the man saw the dog with the telescope"
    pcfg.parse_sentence(sentence)


if __name__ == "__main__":
    main()

 

 

【自然语言处理】CKY算法实战:从数学推导到Python可视化句法树 本文深入解析CKY算法在自然语言处理中的应用,从数学原理到Python实现,详细介绍了如何通过动态规划构建句法树。文章涵盖算法核心思想、乔姆斯基范式、动态规划表设计及可视化技巧,并提供了优化大规模语法处理和概率化CKY算法的实用方法,适合NLP开发者和研究者参考。 阅读详情

相关推荐

NLTK库(1): 数据集-语料库(Corpus)

NLTK (Natural Language Toolkit) 是自然语言处理(NLP)任务的 Python 库,内置大量NLP数据集与计算包。NLP数据集也叫语料库 (Corpus), 若无特殊格式或标记,数据集通常来自txt等文本文件。本教程内容适用版本:涵盖NLP基本操作和大量语料(英文为主):这里以小说nltk.corpus.gutenberg的圣经(‘bible-kjv.txt’)为例:nltk.corpus 模块中包含了多种类型的语料库,可大致分为以下几类:用于自然语言处理中的分词、句法、语义、

disanda的专栏 1680

自然语言处理之判断句子合法性的Chart-Parsing算法

package nlp; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; import java.util.Map.Entry; class ChartLine{ public String wordAttr; public int start; public int...

wqisen's workspace 1333

CKY_Algorithm_PCFG:概率上下文无关文法的 CKY 算法

作业网址: : #PART 1:如何运行代码 问题 4:Shell 脚本:q4.sh 运行大约需要 20 秒 给定从训练数据产生计数的代码 python count_cfg_freq.py parse_train.dat > cfg.counts --> 生成计数文件 用稀有替换单词并用稀有生成新的训练数据 python add_rare.py cfg.counts parse_train.dat > parse_train_rare.dat --> 将带有稀有的新源文件输出到 parse_train_rare.dat 生成稀有训练数据的计数 python count_cfg_freq.py parse_train_rare.dat > cfg_rare.counts --> 生成新的计数文件 问题 5:Shell 脚本:q5.sh 耗时不到 2 分钟 appllies cky_a

基于CYK+PCFG的短语结构句法分析

1 概述 句法分析是自然语言处理中的关键技术之一。其基本任务是确定句子的句法结构(syntatic structure)或句子中词汇之间的依存关系。形式语法理论的目的是试图用精确的数学模型(形式语言)来刻划自然语言。句法分析根据形式语法的不同可以分为基于短语结构语法的句法分析和基于依存关系语法的依存句法分析。本篇文章将介绍使用CKY(一种自底向上的动态规划算法)+PCFG(概率上下文无关文法)的基...

Chase1998的博客 1万+

CKY句法分析器(来自heycinderella )

加入概率的CKY句法分析器 包括前三步从CFG 到CNF的转换 规则来自《自然语言处理综论》 含有一个使用Perl tk制作的图形化界面

CYK-Algorithm.ppt

CYK算法的解释,要想使用cfg, 必须要用cyk算法进行推理

NLP-句法分析之线图分析算法

NLP-句法分析之线图分析算法

shui_chi_的博客 1万+

别再手动填数据了!Vivado里用.coe文件给ROM IP核预装数据的保姆级教程

本文详细介绍了在Vivado中使用.coe文件为ROM IP核预装数据的全流程教程,包括文件格式规范、数据转换技巧和Vivado配置指南。通过自动化数据加载,开发者可以显著提升FPGA开发效率,避免手动输入错误,适用于查找表、波形存储等多种应用场景。

weixin_33377602的博客 337

计算语言学之句法理论

文章目录句法理论线图分析法CYK算法概率上下文无关文法(PCFG)短语结构分析方法评估内部评测对比评测性能指标 本文转发自https://blog.youkuaiyun.com/qq_35082030/article/details/71886825 本文主要介绍的内容有句法理论,基于CFG的线图分析法和CYK算法,以及PCFG算法,并对短语结构标准进行相关介绍。 句法理论 线图分析法 CYK算法 概率...

serryuer的博客 1275

Fiddler抓包实战:5分钟搞定微信公众号历史消息接口分析(附完整Python代码)

本文详细介绍了如何使用Fiddler抓包工具逆向分析微信公众号历史消息接口,并提供完整的Python代码实现。从环境准备、动态参数捕获到商业级采集系统架构设计,全面解析了突破官方接口限制的技术方案,帮助开发者高效获取公众号文章数据。

tree8的博客 325

cartographer从入门到精通(一):cartographer介绍

Cartographer的架构图我们可以看到白色框出来的三个区域,分别是Input Sensor Data(数据输入模块)Local SLAM(局部SLAM模块)Global SLAM (background thread)(全局SLAM模块)下面我们分别介绍一下这几个模块。

weixin_68094467的博客 1051

NLP技术:基于PCFG的CYK算法统计句法分析

自然语言处理重要实践:句法分析。本篇详细记录学习总结和分享经验方法,python实现使用CYK算法对上下无关文法(PCFG)的句法分析,通过核心算法讲解深入理解统计句法分析的思想并掌握具体算法代码实现,得到一个句子的语法树。

陆海潘江的博客 7793

Diffix3D+复现

上下载模型,将其放在一个目录中,并将目录名填在demo代码中from_pretrained的cache_dir参数里。目录结构应该是"<PATH>/nvidia/difix/…给的requirements文件中pytorch和xformers的版本没有指定,这里测试过以下版本,可以成功运行。将readme中的demo代码新建一个python脚本复制进去,然后将脚本放在src目录中运行。如果遇到网络问题无法加载huggingface上的预训练模型,可以手动从。如果出现,以下错误重新。

NeverMakeIt的博客 1085

自然语言处理入门:5分钟搞懂CKY算法如何构建句法分析树

本文以生动的比喻和清晰的步骤,深入浅出地讲解了CKY算法(Cocke–Kasami–Younger Algorithm)如何构建句法分析树。作为自然语言处理(NLP)的核心动态规划算法,CKY通过自底向上的填表策略,高效地将句子解析为语法树,是机器理解语言结构的关键。文章还提供了Python代码实现,并探讨了其在智能问答、机器翻译等领域的应用。

q3r4s5t的博客 466

PRPD图谱分析从入门到精通:5种典型放电模式的识别手册

本文详细解析PRPD图谱分析技术,重点介绍电晕放电、悬浮放电等5种典型放电模式的识别方法。通过37组真实案例对比,提供关键识别区和诊断流程图模板,帮助工程师快速掌握变电站设备状态监测的核心技能,提升绝缘缺陷诊断准确率。

weixin_29214199的博客 466

发票OFD格式转换成PDF

发票OFD格式转换成PDF

Be_insighted的博客 929

Python实战:用CKY算法解析自然语言句法树(附完整代码与可视化)

本文详细介绍了如何使用Python和PyTorch实现CKY算法进行自然语言句法分析。通过动态规划思想,将句子解析为句法树,并提供了完整的代码实现与可视化方法,帮助开发者深入理解自然语言处理中的句法解析技术。

weixin_29061509的博客 282

harbor x509: certificate signed by unknown authority【20251222】

本教程通过「合并证书链(服务器端)+ 预置根 CA(客户端)」彻底解决了自签名证书的 x509 错误,同时集成了 Trivy 漏洞扫描,实现了 Harbor 从搭建到实用的全流程。证书链合并是服务器端的关键,确保客户端获取完整信任路径;客户端需同时配置「系统信任库 + Docker 信任目录」,避免 Docker 独立信任机制导致的问题;所有 IP 需保持一致(Harbor 配置、证书绑定、客户端访问),是避免错误的基础。

老韩的Linux云计算架构师进阶之路 681

【读书笔记】自然语言处理综论 -- 第十四章 -- 统计剖析

第14章 统计剖析 CKY算法和Earley算法可以有效地表示句法歧义,但却没有提供排歧的手段。概率语法提供的方法是,可以计算歧义的每一种解释的概率,然后从中选择概率最大的解释。 概率上下文无关语法(PCFG)最常用。 14.1 概率上下文无关语法 上下文无关语法由四个参数定义: N(非终极符集合),\(\sum\) (终极符集合),R(规则或产生式集合),S(初始符号) 概率上下文无关...

YanqiangWang的专栏 325

ATS Request中的PASID的作用是什么

摘要: PASID(进程地址空间标识符)是PCIe ATS(地址转换服务)中的关键组件,用于标识不同进程或虚拟机的地址空间。其主要作用包括:1)支持多进程共享设备时隔离地址空间;2)实现共享虚拟地址(SVA),允许用户态程序直接访问设备;3)提升虚拟化性能(如SIOV),通过PASID区分虚拟机请求;4)增强安全性,基于PASID限制设备内存访问权限。PASID通过20位标识符在TLP前缀中传递,与IOMMU协作完成地址转换与缓存,适用于高性能计算、AI及虚拟化场景,但依赖硬件支持和软件适配。

元直的博客 1560

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PCFG CKY句法分析

1.什么是句法分析 2.评估语法树

cpt_ljy的博客 1248

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

开源项目pyStatParser常见问题解决方案

开源项目pyStatParser常见问题解决方案 1. 项目基础介绍与主要编程语言 pyStatParser 是一个简单的Python统计(CKY)解析器,它包括从QuestionBank和Penn树库中学习PCFG(概率上下文无关文法)的脚本。该项目主要用于自然语言处理领域,可以帮助开发者处理文本解析任务。主要编程语言是 Python。 2. 新手常见问题及解决步骤 问题一:如何安装pyStat...

gitblog_01034的博客 644

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:05 特征工程和NLP算法

05 特征工程和NLP算法5.1 理解特征工程5.1.1 特征工程的定义5.1.2 特征工程的目的5.1.3 一些挑战5.2 NLP中的基础特征5.2.1 句法解析和句法解析器5.2.2 词性标注和词性标注器理解词性标注和词性标注器的概念一步步开发词性标注器即插即用现有词性标注器使用词性标注作为特征挑战5.2.3 命名实体识别NER类Stanford NERSpacy NER提取和理解特征挑战5....

weixin_43935926的博客 2124

python实现自顶向下的句法分析和基于CYK算法的句法分析

python实现自顶向下的句法分析和基于CYK算法的句法分析

qq_48068259的博客 1172

NLP 课程笔记

NLP 课程笔记 stevenliuyi   http://mooc.guokr.com/note/157/2013-08-02 16:51 课程涵盖范围: NLP 子问题(NLP sub-problems):词性标注(part-of-speech tagging)、句法分析(parsing)、词义辨识(word-sense disambiguation)

klzhang的专栏 2591

NLP基础知识

文章目录1、NLP简介自然语言处理的研究方向2、词法分析分词工具有哪些?JiebaHanLP3、句法分析4、文本表示**文本离散表示****文本分布式表示**工具 1、NLP简介 自然语言处理(Natural Language Processing, NLP)是计算机科学、人工智能、语言学的交叉学科,研究在人与人交互中以及与计算机交互中的语言问题。为了建设和完善语言模型,自然语言处理建立计算框架,...

ling620的专栏 1472
上一篇: CYK算法简介与实现
下一篇: PCFG parser及实现
CopperDong
博客等级 码龄14年 1205粉丝 466原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值