第十一篇:Discourse 话语/论述

目录

话语

大纲

话语分割

无监督方法

监督方法

有监督的话语分割器

话语解析

话语单元DU

话语关系

核与卫星

RST树

RST 解析

使用话语标记进行解析

使用机器学习进行解析

自底向上解析

自顶向下解析

话语解析特征

回指解析Anaphora Resolution

动机

先行词限制

先行词偏好

实体和参考

中心理论

对于一个表达(Utterance) Un

中心算法

有监督的回指解析

回指解析工具

总结


话语

• 我们学到的大多数任务/模型都在单词或句子级别运行:
    ‣ 词性标注
    ‣ 语言模型
    ‣ 词法/分布语义
• 但 NLP 经常处理文档
• 话语:了解文档中句子之间的相互关系

大纲

• 话语分割
• 话语解析
• 回指解析

话语分割

• 可以将文档视为段序列
• 一段:一段连贯的文本
• 凝聚力:围绕一个主题或功能进行组织

• 比如 科学文章:介绍、相关工作、实验

无监督方法

• TextTiling 算法:寻找句子之间词汇衔接低的点

• 对于每个句子间隙:
    ‣ 创建两个 BOW 向量,由间隙两侧的 k 个句子中的单词组成
    ‣ 使用余弦获得两个向量的相似度分数 (sim)
    ‣ 对于间隙 i,计算深度分数,当深度大于某个阈值 t 时插入边界

监督方法

• 从简单的来源获取带标签的数据
    ‣ 科学出版物
    ‣ 维基百科文章

有监督的话语分割器

• 应用二元分类器来识别边界
• 或使用顺序分类器
• 可能包括章节类型的分类(介绍、结论等)
• 集成更广泛的功能,包括
    ‣ 分布式语义
    ‣ 话语标记(因此,和等)


话语解析

• 确定话语单元,以及它们之间的关系
• 修辞结构理论 (RST) 是对文档中的话语结构进行层次分析的框架

话语单元DU

• 句子的典型从句
• DU 不跨越句子边界
• [它确实有美丽的风景,] [自指环王以来最好的一些。]
• 2 个合并的 DU = 另一个复合 DU

话语关系

• 话语单元之间的关系:
‣ 连词、证明、让步、阐述等
‣ [它确实有美丽的风景,]
          ↑(详述)
[自指环王以来最好的一些。]

核与卫星

• 在话语关系中,一个论点是核心(主要论点)
• 支持论点是卫星
    ‣ [它确实有美丽的风景,]核心
            ↑(详述)
       [自指环王以来最好的一些。]卫星
• 有些关系是相等的(例如合取),因此两个参数都是核心
     ‣ [他是一个讨人喜欢的家伙,]核心
            ↑(连词)
       [我讨厌看到他死。]核心

RST树

• RST 关系将两个或多个 DU 组合成复合 DU
• 重复合并 DU 的过程,创建 RST 树

RST 解析

• 任务:给定一个文档,恢复 RST 树
    ‣ 基于规则的解析
    ‣ 自下而上的方法
    ‣ 自上而下的方法

使用话语标记进行解析

• 一些话语标记(提示短语)明确表示关系
    ‣ 虽然,但是,例如,换句话说,所以,因为,总而言之,......
• 可用于构建简单的基于规则的解析器
• 然而
    ‣ 许多关系没有用话语标记来标记
    ‣ 许多话语标记不明确(例如和)

使用机器学习进行解析

• RST 话语树库
    ‣ 300 多个用 RST 树注释的文档
• 基本理念:
    ‣ 将文档分割为 DU
    ‣ 将相邻的 DU 迭代组合成复合 DU 以创建完整的 RST 树(自底向上解析)

自底向上解析

• 基于转换的解析(第 13篇会讲):
    ‣ Greedy,使用shift-reduce算法
• CYK/图表解析算法(第 14 篇会讲)
    ‣ 全局,但一些约束阻止 CYK 找到全局最优树进行话语解析

自顶向下解析

1. 将文档分割成 DU
2. 确定一个边界,分成 2 个部分
3. 对于每个段,重复步骤 2

话语解析特征

• 词袋
• 话语标记
• 开始/结束 n-gram
• 在文本中的位置
• 语法特征
• 词汇和分布相似性


回指解析Anaphora Resolution

回指:指回文本中较早元素的语言表达
• 回指在话语中有先行词,通常但不总是名词短语
    ‣ 昨天,艾伦上班迟到了。 这一切都始于他的车无法启动。
• 代词是最常见的回指
• 但还有其他各种
    ‣ 指示词(那个问题)

动机

• 深度语义分析必不可少
‣ 对 QA 非常有用,例如阅读理解
泰德的车抛锚了。 于是他到比尔家去借他的车。 比尔说那很好。
借谁的车?

先行词限制

• 代词的数量必须与其先行词一致
    ‣ 当 Ted 到达时,他的同事正在离开吃午饭。 他们邀请了他,但他拒绝了。
• 代词的性别必须与其先行词一致
    ‣ 当泰德到达时,苏正在吃午饭。 她邀请了他,他拒绝了。
• 其先行词是同一句法从句的主语的代词必须是自反的 (...self)
    ‣ Ted was angry at him. [him ≠ Ted]
    ‣ Ted was angry at himself. [himself = Ted]

先行词偏好

• 代词的先行词应该是最近的
    ‣他又等了20分钟,电车没有来。 于是他走回家,把自行车从车库里拿出来。 他开始骑它上班。
• 先行词应该是显着的,由语法位置决定
    ‣ 主语 > 宾语 > 介词论据
    ‣ Ted 通常骑马和 Bill 一起工作。 他从不迟到。

实体和参考

• 话语 16.1(左)更加连贯
• 代词都始终指代约翰,主角 

中心理论

• 统一论述话语结构和实体指称之间的关系
• 话语中的每个表达都以一组实体为特征,称为中心
• 解释某些实体对含糊代词的偏好

对于一个表达(Utterance) Un

• 向前看中心:
    ‣ Un中的所有实体:
    Cf(Un) = [e1, e2, …]
    ‣ Cf(16.1a) = [约翰,音乐商店,钢琴]
    ‣ 按句法显着性排序:主语 > 宾语

• 向后看中心:
    ‣ 先前表达 (Cf(Un-1)) 中排名最高的向前看中心,同时也在当前话表达(Un) 中
    ‣ 16.1b 中的候选实体 = [John, music store]
    ‣ Cb(16.1b) = [约翰]
    ‣ 不是音乐商店,因为 John 在之前话语的向前看中心 Cf(Un-1) 中的排名更高,所有确定了He指的是John

中心算法

• 解析实体以进行回指解析时,选择实体以使顶部的向前看中心与向后看中心匹配
• 为什么? 因为满足这个条件,文字读起来更流畅

文本是连贯的,因为最顶端的向前看中心与每个表达的向后看中心相匹配:
向前看中心 = 约翰
向后看中心 = 约翰

Cf(16.2b) = [music store, John]
Cb(16.2b) = [John]
Cf(16.2d) = [music store, John]
Cb(16.2d) = [John]

有监督的回指解析

• 为照应(回指)/先行词对构建二元分类器
• 将限制和偏好转换为特征
    ‣ 数字/性别兼容性的二进制特征
    ‣ 先行词在文本中的位置
    ‣ 包括关于先行词类型的特征
• 有足够的数据,可以逼近中心算法
• 但也很容易包含可能有用的特征
    ‣ 回指/先行词周围的词

回指解析工具

• 斯坦福 CoreNLP 包括代词共指模型
‣ 基于规则的系统还不错
‣ 比神经网络模型快得多

参考地址

总结

• 对于许多任务,考虑比句子大的上下文很重要
• 传统上,许多流行的 NLP 应用程序都以句子为中心(例如机器翻译),但这种情况正在开始改变……

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现错误,请优化。错误描述:ERROR Brian 2 encountered an unexpected error. If you think this is a bug in Brian 2, please report this issue either to the discourse forum at <http://brian.discourse.group/>, or to the issue tracker at <https://github.com/brian-team/brian2/issues>. Please include this file with debug information in your report: C:\Users\mana\AppData\Local\Temp\brian_debug_pgl7l4v3.log Additionally, you can also include a copy of the script that was run, available at: C:\Users\mana\AppData\Local\Temp\brian_script_ixr169pb.py Thanks! [brian2] Traceback (most recent call last): File "E:/SNN/python/project/测试.py", line 36, in <module> synapses = Synapses(neurons, neurons, stdp_eqs, on_pre=stdp_on_pre, on_post=stdp_on_post) File "C:\Users\mana\AppData\Local\Programs\Python\Python37\lib\site-packages\brian2\synapses\synapses.py", line 822, in __init__ self._create_variables(model, user_dtype=dtype) File "C:\Users\mana\AppData\Local\Programs\Python\Python37\lib\site-packages\brian2\synapses\synapses.py", line 1175, in _create_variables check_identifier_pre_post(eq.varname) File "C:\Users\mana\AppData\Local\Programs\Python\Python37\lib\site-packages\brian2\groups\neurongroup.py", line 89, in check_identifier_pre_post raise ValueError(f"'{identifier}' cannot be used as a variable name, the " ValueError: 'A_post' cannot be used as a variable name, the '_pre' and '_post' suffixes are used to refer to pre- and post-synaptic variables in synapses.
最新发布
07-23
非常抱歉遇到了错误。根据错误信息,问题出在使用了`A_post`作为变量名。这是因为在Brian2中,`_pre`和`_post`后缀用于表示突触前后的变量。 为了解决这个问题,我们可以修改STDP规则的变量名,以避免和预定义的后缀冲突。 以下是修改后的代码: ```python import numpy as np import matplotlib.pyplot as plt from brian2 import * # 设置参数 N = 100 # 神经元数量 duration = 500 * ms # 模拟时间 dt = 0.1 * ms # 时间步长 # 定义方程和STDP规则 eqs = ''' dv/dt = (I - v) / (10*ms) : 1 (unless refractory) I : 1 ''' # 定义STDP规则 stdp_eqs = ''' w : 1 dApre/dt = -Apre / tau_pre : 1 (event-driven) dApost/dt = -Apost / tau_post : 1 (event-driven) ''' stdp_on_pre = ''' v_post += w Apre += dApre w = clip(w + Apost, 0, w_max) ''' stdp_on_post = ''' Apost += dApost w = clip(w + Apre, 0, w_max) ''' # 创建神经元组和连接权重 neurons = NeuronGroup(N, eqs, threshold='v>1', reset='v=0', refractory=5*ms) synapses = Synapses(neurons, neurons, stdp_eqs, on_pre=stdp_on_pre, on_post=stdp_on_post) synapses.connect() # 随机初始化神经元电流和连接权重 neurons.I = 'rand()' synapses.w = 'rand()' # 记录神经元脉冲 spikes = SpikeMonitor(neurons) # 运行仿真 run(duration) # 提取脉冲时间和神经元索引 spike_times = spikes.t spike_indices = spikes.i # 将脉冲分类为5个类别 num_classes = 5 classes = [[] for _ in range(num_classes)] for t, idx in zip(spike_times, spike_indices): class_idx = int(idx / (N / num_classes)) classes[class_idx].append(t) # 绘制脉冲响应结果 plt.figure(figsize=(10, 5)) for i, class_spikes in enumerate(classes): plt.eventplot(class_spikes, color='C{}'.format(i), linewidths=0.5) plt.xlabel('Time (ms)') plt.ylabel('Class Index') plt.title('Spike Response') plt.xlim(0, duration/ms) plt.ylim(0, num_classes-1) plt.show() ``` 请注意,我们将`dA_pre`和`dA_post`改为`dApre`和`dApost`,以避免与后缀冲突。同时,我们也将相应的变量名在STDP规则中进行了修改。 如果您还遇到任何问题,请随时向我提问。非常抱歉给您带来的不便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值