上一版的 否定、因果、关系、属性 其实已经是“语言学层面的高级操作”了。比如“否定”完全可能不是基本函数,而只是:
对一个已有结构进行修改。
如果一直往下拆,我会把自然语言处理的基本操作压缩到类似增、删、改、移、复制、匹配、组合这一层。
一、先不要问“这句话是什么意思”,而问“对一个语言结构做什么操作”
可以把 NLP 看成一个对象变换系统:
输入语言结构
↓
基本操作
↓
新的语言结构例如:
小明喜欢猫
修改成:
小明不喜欢猫
最基本的事情其实只有:
找到“喜欢”
↓
修改
↓
“喜欢” → “不喜欢”所以“否定”未必是一个基本函数。
二、我认为最值得测试的最小操作可以是这几个
我先给一个非常激进的版本。
① 查找 FIND
从结构中找到某个元素。
FIND(猫)例如:
小明喜欢黑猫。
找到:
小明
喜欢
黑
猫甚至可以不是按照“词”查找,而是寻找符合某种条件的节点。
三、替换 REPLACE
这是最重要的基本操作之一。
REPLACE(A, B)例如:
小明喜欢猫替换:
小明 → 小红得到:
小红喜欢猫也可以:
猫 → 狗得到:
小明喜欢狗四、修改 MODIFY
替换和修改可以区分。
替换是:
A → B
修改是:
保留 A 的主体,只改变某个属性。
例如:
黑猫修改颜色:
黑猫 → 白猫或者:
小明很高修改程度:
小明很高 → 小明非常高不过这里要注意:
替换和修改到底需不需要分开,是实验问题。
甚至可以尝试:
一切修改都是替换。
如果真的可以,那么基本函数还可以进一步减少。
五、删除 DELETE
例如:
小明昨天去了北京。
删除“昨天”:
小明去了北京。删除“北京”:
小明去了。因此:
DELETE(x)可能是非常底层的操作。
六、插入 INSERT
和删除对应:
INSERT(x, position)例如:
小明去了北京。插入:
昨天变成:
小明昨天去了北京。所以很多语言变化其实可以理解成:
删除
+
插入七、移动 MOVE
这个也很有意思。
例如:
小明昨天去了北京。
变成:
昨天,小明去了北京。
这里很多信息其实没有改变,只是:
MOVE(昨天, 句首)所以“语序”可能根本不需要一个复杂的语言模型来理解。
八、复制 COPY
自然语言里大量存在重复引用。
例如:
小明拿起苹果,然后他吃掉了它。
这里:
他 → 小明
它 → 苹果某种意义上就是:
COPY_REFERENCE(小明 → 他)
COPY_REFERENCE(苹果 → 它)更底层一点,可以叫:
REFERENCE但我甚至会测试:
引用是否可以由“匹配 + 复制”产生?
九、匹配 MATCH
这是我认为特别重要的一个。
例如:
小明喜欢猫。下一句:
他每天都去看它。系统需要发现:
他 ≈ 小明
它 ≈ 猫这就是:
MATCH(A, B)而且 MATCH 不一定是完全相同。
例如:
汽车和:
这辆车也可以匹配。
所以:
语义理解可能很大一部分就是在寻找“哪些东西可以匹配”。
十、组合 COMBINE
最后是把几个结构放在一起。
例如:
小明喜欢猫和:
猫喜欢吃鱼组合:
小明喜欢猫,猫喜欢吃鱼。更进一步:
小明喜欢[猫喜欢吃的鱼]于是:
COMBINE(A, B)可能是语言产生复杂结构的核心操作。
十一、这样可以得到一个非常小的“语言操作集”
我建议第一版甚至只测试:
| 操作 | 含义 |
|---|---|
FIND | 找到某个元素 |
MATCH | 判断两个元素/结构是否对应 |
INSERT | 插入 |
DELETE | 删除 |
REPLACE | 替换 |
MOVE | 移动 |
COPY | 复制 |
COMBINE | 组合 |
甚至可以进一步挑战:
能不能把 8 个继续压缩到 4~5 个?
例如:
FIND
MATCH
MODIFY
COMBINE然后看看:
INSERT
DELETE
REPLACE
MOVE
COPY是不是都可以由这几个操作组合出来。
十二、举一个非常有意思的例子
例如原句:
小明喜欢猫。
我们想得到:
小明不喜欢狗。
传统 NLP 可能认为这是一个新的句子,要重新理解。
但你的体系可以认为:
原结构:
喜欢
/ \
小明 猫然后:
第一步:MATCH
找到:
猫第二步:REPLACE
猫 → 狗得到:
小明喜欢狗。
第三步:MODIFY
喜欢 → 不喜欢得到:
小明不喜欢狗。
也就是说:
原句
↓
找到
↓
匹配
↓
修改
↓
新句这比直接判断整个句子的语义简单得多。
十三、甚至可以把“复杂语言理解”看成程序执行
这是我觉得你这个想法最值得深入的地方。
例如:
小明昨天买了一辆红色汽车。他今天把它卖给了小王。
系统不是直接把第二句话变成一个巨大的向量。
而是执行一系列非常简单的操作:
FIND("他")
↓
MATCH("他", 前文人物)
↓
MATCH → 小明
FIND("它")
↓
MATCH("它", 前文物体)
↓
MATCH → 红色汽车
建立事件
↓
小明
卖
红色汽车
小王那么:
“理解文章”是不是本质上就是不断执行这些简单操作?
这就是一个非常值得实验的问题。
十四、这甚至可以形成你的“基函数假说”
我建议你暂时把理论表述成:
自然语言的复杂结构可能不是由大量不可约的高级语义模块构成,而是由少量基本操作在不同对象、不同层级上递归组合而成。
进一步可以提出:
自然语言处理的基本单位不一定是“词”,也不一定是“句子”,而可能是“对语言结构进行操作的函数”。
例如:
FIND
MATCH
INSERT
DELETE
REPLACE
MOVE
COPY
COMBINE复杂能力:
否定
↓
MODIFY
因果
↓
COMBINE
指代
↓
MATCH + COPY
改写
↓
FIND + REPLACE
摘要
↓
FIND + DELETE + COMBINE
翻译
↓
MATCH + REPLACE + MODIFY + REORDER
推理
↓
MATCH + COMBINE + MODIFY这就产生一个非常漂亮的研究路线:
不是先设计“理解、推理、翻译、摘要”这些高级模块,而是先寻找最少的一组语言操作,然后证明高级能力能不能由它们组合出来。
十五、而且这非常适合你之前的“语义扩散”思路
可以进一步形成两层:
自然语言
↓
┌───────┴───────┐
↓ ↓
结构节点 操作节点
↓ ↓
语义网络 FIND / MATCH
↓ REPLACE / MOVE
↓ COPY / COMBINE
└───────┬───────┘
↓
结构不断变化
↓
复杂理解这样你甚至可以不依赖传统 Transformer 的 token→巨大向量→attention 这一条路线,而是研究一种:
“语言结构 + 局部匹配 + 基本操作 + 递归组合”的 NLP。
我觉得下一步最关键的不是继续增加函数,而是反过来做一件事:
把这 8 个函数压缩到可能的最小集合,然后拿 20~50 个典型语言现象逐个证明:它到底能不能由这些最基本操作组合出来。
如果能做到这一点,你就不只是“提出一种 NLP 算法”,而是在尝试寻找自然语言处理的操作公理系统。