句翻译x模板 再谈*小熵原理:“飞象过河”之句模版和语言结构 | 附开源NLP库

日期:2023-03-11 12:39:36 / 人气: 633 / 发布者:成都翻译公司

事实上,有了前一文的构建词库的经验,事实上就不难构思生成句子模版的算法了。每个语义块由一个主的句模版生成,其中句模版的占位符部分也是一个语义块;有了对句子结构的假设,我们就可以描述句模版识别算法了。因为构建句模版是基于词来统计的,因此还需要一个分词函数,可以用自带的分词器,也可以用外部的,比如结巴分词。基于句模版来进行句子结构解析。

作者丨苏健林

单位丨广州火焰信息技术有限公司

研究方向丨NLP,神经网络

个人主页丨kexue.fm

在上一篇文章中,我们根据*小熵原理进行了一系列数学推导,*终得到(2.15)和(2.17)) ,这告诉我们应该合并互信息比较大的两个元素,这样有助于降低“学习难度”。

从单词到单词,从单词到短语,检查相邻元素是否可以组合成一个好的“套路”。但为什么例程必须相邻?

当然,它不一定是相邻的。当我们学习一门语言时,我们不仅会学习单词和短语,还会学习“固定搭配”,这意味着如何使用单词是合理的。这是语法的一种体现,也是本文所要表达的。查询,希望*终实现一定程度的无监督句法分析。

因为这次考虑的是跨邻词的语言联想,我把它命名为“飞象过江”,正是:“套路宝典”的第二种——“飞象过江”。

语言结构

对于大多数人来说,他们并不真正了解什么是语法。他们脑子里只有一些“固定搭配”、“固定风格”,或者更正式的称呼“模板”。在大多数情况下,我们会根据模板说合理的话。不同的人可能有不同的说话模板。这是个人的说话风格,甚至是“口头禅”。

句子模板

比如“What is the Y of X”就是一个简单的模板,里面有一些明确的词“of”、“is”、“what”,还有一些占位符X、Y,就用两个X和Y代替一个名词,你得到一个语法句子(如果它是真的,那是另一回事)。此类模板的例子有很多,例如“X 和 Y”、“X 的 Y”、“X 可以是 Y”、“Y 有什么 X 有”、“是 XY 还是 Z”等等。

▲句子模板和相互嵌套的例子

当然,虽然可以提取出尽可能多的模板,但有限的模板无法覆盖千变万化的语言想象,所以更重要的是,它是基于模板的嵌套使用。例如,对于模板“X 的 Y 是什么”,可以将 X 替换为模板“A 和 B”以得到“(A 和 B) 的 Y 是什么”。这样,如果模板相互嵌套,你可以得到相当多的句子。

等价类

那么,有了模板“X的Y是什么?”,我们怎么知道X和Y分别可以填什么?

刚才我们说“随机使用两个名词”,但是按照我们的想法,到现在我们只会建立一个词库。我们甚至不知道什么是“名词”,更不用说我们应该填写名词了。. 事实上,我们不需要提前知道任何事情。我们可以通过一个大的语料库来提取每个候选位置的“等价类”。X的候选词构成一个词等价类,Y的候选词也构成一个词。等价类等

▲句型和等价物的概念

当然,这样的场景是理想的。其实我们能得到的原始语料要差很多,但不管怎样,我们还是先解决理想情况,实际使用的时候再考虑一般情况。

下面我们来探讨如何从大量原始语料中一一获取句子模板,考虑如何识别句子中使用的句子模板,甚至挖掘出句子的层次结构。

生成模板

其实,有了上一篇建词库的经验,想出一个生成句子模板的算法其实并不难。

在构建词库时,我们的统计对象是单词。现在我们的统计对象是词。另外,词是由相邻的词组成,但句子模板可能不是由相邻的词组成(否则会退化为词或词组),所以我们还需要考虑跨词共现,也就是Skip Word2Vec 中的 Gram 模型。

有向无环图

有向无环图(DAG)实际上是 NLP 中经常遇到的一种图论模型。实际上,一元分词模型也可以直接抽象为有向无环图上的*短路径规划问题。这里的候选模板集的构建也需要一个有向无环图。

因为考虑了Skip Gram模型,我们可以把句子中的“compact”(较大的互信息)“词对”连接起来。从图论的角度来看,这构成了一个“有向无环图”:

我们直接把图上的所有路径都取出来,如果穿过相邻的节点,则插入一个占位符(下面全X代表占位符),这样就可以得到候选模板集了。例如从上图中提取的候选模板为:

算法步骤

我们可以将上述过程详细描述如下:

1. 将语料分成句子,切词;

2. 选择一个窗口大小的窗口,从语料中统计每个词(pa, pb)的出现频率,以及窗口大小(pab)中任意两个词的共现频率;

3. 分别设置频率阈值min_prob和互信息阈值min_pmi;

4. 遍历所有句子:

4.1. 为每个句子构造一张图片,句子中的词作为图片上的点处理;

4.2. 句子窗口中的词对(a, b),若满足pab>min_prob和>mi_pmi句翻译x模板,则在图;

4.3. 找出图上的所有路径(孤立点也算路径),作为候选模板加入统计;

5. 统计每个“准模板”出现的频率,将“准模板”按频率降序排序,只取第一部分。

这个算法可以用来提取句子模板,也可以简单的提取词组(phrases),只要窗口设置为1就可以了。 所以基本上包括了上一篇提到的词库构建,所以上面的算法是一个泛化提取框架。

效果展示

以下是从百度知道的问题集中提取的一些句子模板(数字是统计的频率,可以忽略):

请注意,实际上,由两个占位符(如“X of X”和“X how X”)夹在中间的单词模板是微不足道的。它只告诉我们这个词可以插入一个句子中。因此,为了看效果,我们排除了这种类型的模板,得到:

从结果来看,我们的句子模板生成确实有效。因为这些句子模板帮助我们发现语言使用的规则。例如:

1.“X?”、“X?”、“How about X”模板的占位符出现在前面,表示这些词可以放在问题的末尾(我们使用的语料库是问题);

2.模板的占位符如“IX”、“Seeking X”、“Why X”、“Excuse me X”出现在后面,表示这些词可以放在问句的开头;

3. “Thank you”和“What to do”模板没有出现在占位符中,表示可以自行组成句子;

4. “X 意味着 X”、“X 有什么 X 有”等模板反映了语言的一些固定搭配。

从一般的角度来看,这些模板在句法层面描述了语言现象。当然,为了不与当前主流的句法分析相混淆,我们不妨称之为语言结构规律,或者直接称之为“句子模板”。

结构分析

和分词一样,在构造句子模板的时候,我们也需要一个算法来识别句子中使用了哪些模板。只有这样,才能从语料中识别出单词的等价类。

回顾分词算法,分词只是一个句子切分问题。被分割的词没有“洞”(占位符)。如果要识别句子中使用了哪些模板,这些模板都有“洞”。并且可能相互嵌套,造成识别困难。然而,一旦我们能够做到这一点,我们就会得到句子的层次分解,这是一个非常有吸引力的目标。

投射假设

为了实现句子的层次分解,我们可以先借鉴句法分析中普遍使用的“投射假设”。

语言的投影大致是指,如果一个句子可以分成几个“语义块”,那么这些语义块是不重叠的。换句话说,如果第3个词1、2、构成语义块,第5个词构成语义块,这种情况是允许的,并且1、2、4个词形成语义块,第5个词3、形成语义块。这种情况是不可能的。大多数语言,包括中文和英文,基本满足投影。

结构假设

为了完成句子层次的分解,我们需要对句子的构成结构做更完整的假设。受投射假设的启发,作者认为句子的结构可以假设如下:

1. 每个语义块都是句子的一个连续子串,句子本身也被视为一个语义块;

2. 每个语义块由一个主句模板生成,句子模板的占位符部分也是一个语义块;

3. 每一个单独的词都可以看作是一个琐碎的句子模板,或者是一个*小粒度的语义块。

说白了,这三个假设可以概括为一个句子:每个句子都是通过嵌套句子模板生成的。

乍一看,这个假设不够合理,但仔细想想,你会发现这个假设足以描述大多数句子的结构。读者可能会怀疑“是否可以并行使用两个句子模板而不是嵌套”?答案是:不应该。

因为如果发生这种情况,您只需要将“并行”本身视为模板。例如,如果将“X and X”视为模板,则“X and X”模板中的两个语义块是平行的。是的,它甚至可以与自身嵌套以获得“X and (X and X)”来描述更多并行现象。

正是因为我们对语言结构做了这个假设,所以一旦我们确定了一个句子的*优句子模板组合,我们就得到了句子层次——因为根据假设,模板以嵌套的方式组合是的,嵌套表示递归,递归是一个层次树结构。

分解算法

在句子结构的假设下,我们可以描述句子模板识别算法。首先,让我们重述分词算法。一元分词算法的思想是将句子切分成词,使这些词的概率的对数之和*大(信息量之和*小)。

还可以改变表达方式:找一系列词来覆盖句子中的每个词,不重复,使这些词的概率的对数之和*大(信息量之和*小) )。

过去,我们会认为分词是对句子进行分割,但这个等价的表达方式恰恰相反,涵盖了句子。有了这种逆向思维,可以提出一种模板识别算法:

找一系列的句子模板来覆盖句子中的每个词,不重复、不遗漏、不重叠,使这些模板的概率的对数之和*大(信息量之和*小)。

当然,这只是一个想法。在实现过程中,主要难点是占位符的处理。也就是说,句子中的每个单词都代表单词本身和占位符。这种二元性使得扫描和识别变得困难。

幸运的是,如果我们按照上面假设的语言结构,我们可以将其转化为递归操作:在*优结构分解方案中,主模板下每个语义块的分解方案也是*优的。

▲句子层次分析,包括句子模板的嵌套调用

所以我们可以得到算法:

1. 扫描句子中所有可能的模板(通过Trie树结构可以快速扫描);

2. 每个分解方案的得分等于句子主模板的得分,加上每个语料库的*优分解方案的得分。

结果显示

下面是一些简单示例的演示。它通过有限数量的模板进行分析。可以看出,句子层次的分析确实已经初步实现了。

+---> (鸡蛋)可以(吃)吗
|     +---> 鸡蛋
|     |     +---> 鸡蛋
|     +---> 可以
|     +---> 吃
|     |     +---> 吃
|     +---> 吗

+---> (牛肉鸡蛋)可以(吃)吗
|     +---> 牛肉鸡蛋
|     |     +---> 牛肉
|     |     +---> 鸡蛋
|     +---> 可以
|     +---> 吃
|     |     +---> 吃
|     +---> 吗

+---> (苹果)的(颜色)是(什么)呢
|     +---> 苹果
|     |     +---> 苹果
|     +---> 的
|     +---> 颜色
|     |     +---> 颜色
|     +---> 是
|     +---> 什么
|     |     +---> 什么
|     +---> 呢

+---> (雪梨和苹果和香蕉)的(颜色)是(什么)呢
|     +---> (雪梨和苹果)和(香蕉)
|     |     +---> (雪梨)和(苹果)
|     |     |     +---> 雪梨
|     |     |     |     +---> 雪梨
|     |     |     +---> 和
|     |     |     +---> 苹果
|     |     |     |     +---> 苹果
|     |     +---> 和
|     |     +---> 香蕉
|     |     |     +---> 香蕉
|     +---> 的
|     +---> 颜色
|     |     +---> 颜色
|     +---> 是
|     +---> 什么
|     |     +---> 什么
|     +---> 呢

当然,报告好坏是不可能的,还有一些失败的例子:

+---> (我的美味)的(苹果的颜色)是(什么)呢
|     +---> (我)的(美味)
|     |     +---> 我
|     |     |     +---> 我
|     |     +---> 的
|     |     +---> 美味
|     |     |     +---> 美味
|     +---> 的
|     +---> (苹果)的(颜色)
|     |     +---> 苹果
|     |     |     +---> 苹果
|     |     +---> 的
|     |     +---> 颜色
|     |     |     +---> 颜色
|     +---> 是
|     +---> 什么
|     |     +---> 什么
|     +---> 呢

+---> (苹果)的(颜色)是(什么的意思是什么)呢
|     +---> 苹果
|     |     +---> 苹果
|     +---> 的
|     +---> 颜色
|     |     +---> 颜色
|     +---> 是
|     +---> (什么)的(意思)是(什么)
|     |     +---> 什么
|     |     |     +---> 什么
|     |     +---> 的
|     |     +---> 意思
|     |     |     +---> 意思
|     |     +---> 是
|     |     +---> 什么
|     |     |     +---> 什么
|     +---> 呢

我们稍后会分析失败的例子。

文章摘要

一脸懵逼,各种话想吐,请先看本段。

拼图游戏

从单词和短语到句子模板,我们似乎都在玩拼图游戏:我们发现这两个部分尽可能地协同工作,所以让我们把它们放在一起。因为将大项互信息组合起来,作为一个整体,有利于降低整体信息熵,也降低整体学习难度。

关于句型,如果你在中文世界搞不清楚,那就回顾一下我们在小学和初中是如何学英语的。那我们应该已经学了很多英语句子模板了。

有什么用

“句子模板”是本文提出的一个新概念,用它来识别语言结果也是一种新的尝试。读者不禁要问:这玩意有什么用?

我认为回答这个问题*好的方法是引用牛顿的一段话:

我个人认为,我似乎只是一个在沙滩上玩耍的孩子,不时为捡到比平时更光滑的石头或更漂亮的贝壳而欢欣鼓舞,而展现在我面前的是一片未知的真相。

我引用这段话是为了表明进行这种探究的*根本原因不是出于某种实际目的,而纯粹是为了探索自然语言的奥秘。

当然,如果同时研究成果能够具有一定的应用价值句翻译x模板,那就更完美了。从目前的结果来看,这个应用价值可能存在。

因为在 NLP 中,我们面对的句子是千变万化的,但实际上“句型”是有限的,这也意味着句子模板也是有限的。如有必要,我们可以调整每个句子模板的占位符的含义。人工标注可以将句子模板的结构与常规的句法描述对应起来。通过有限的句子模板(无限地)分解句子,可以使 NLP 可以面对的场景更加灵活多变。

或许以往传统的自然语言处理中也出现过类似的事情,但本文描述的内容纯属无监督结果,也有自洽的理论描述。是一个比较完整的框架,初步效果并不理想。因此,值得进一步考虑其应用价值。

硬进

看完这篇文章,读者*大的感受可能是“惊呆了”:能不能稍微简化一下?

要回答这个问题,不得不提一下:距离本系列的上一篇文章已经一个多月了,这篇文章正式发布了。好像很久了?从形式上看,这篇文章只是对上一篇文章的简单推广:不是将相邻的关联扩展到非相邻的关联吗?

的确,它在形式上是正确的。但要推动这个想法兼具理论和实践价值,并不是那么简单和顺利的。例如,在生成句子模板时,如何无遗漏地获取所有候选模板是一个难题;其次,获取到句子模板后,如何识别句子中的句子模板(无论是自动生成的还是手动输入的),这个就更难了。无论是理论思维还是编程实现都存在不少障碍。有必要对树结构和递归编程有一个清晰的掌握。我也是调试了半个多月才把整个流程调整好,但是估计还没有完成。

所以,你一脸懵逼是正常的,我自己写完这篇文章还是觉得很震惊。

改进思路

在结果部分,我们还展示了一些失败的例子。事实上,可能还有更多的失败。

我们要从两个方面来看待这个问题。一方面,我们有成功的例子,对应于纯无监督挖掘的探索。即使我们只能得到一小部分成功的结果,也值得欣喜;另一方面,对于失败的例子,我们需要思考失败的原因。并考虑解决方案。

笔者认为整体句子模板思维没有问题,问题在于我们还没有达到真正的语义理解层次。比如第一个失败的例子,结果是:(我的好吃的)(苹果的颜色)是(什么)。

我们能说这种分解是完全错误的吗?显然不是。严格来说,这种分解没有任何语法错误,但不符合语义,也不符合我们的常识。因此,这不是句子模板的错,而是无法充分整合语义来构建句子模板。

回顾目前主流的句法分析工作,无论是有监督的还是无监督的,基本上都要结合“词性”来完成句法分析。所以这为我们提供了一个方向:*小熵序列的下一步是探索词聚类问题,以便更好地捕捉词义和语言共性。

基于*小熵原理的 NLP 库:NLP Zero

我已经陆续写了几篇关于*小熵原理的文章,致力于无监督NLP的一些基础工作。为方便实验,将文章中涉及的部分算法封装为库,供有需要的读者测试使用。

由于它是面向无监督NLP场景的,而且基本上是NLP任务的基础工作,所以命名为NLP Zero。

地址

GitHub:

皮皮:

您可以直接通过:

pip install nlp-zero==0.1.6

安装它。整个库采用纯Python实现,没有第三方调用,支持Python2.x和3.x。

默认分词

库中包含字典,可用作简单的分词工具。

from nlp_zero import *

t = Tokenizer()
t.tokenize(u'扫描二维码,关注公众号')

内置词典增加了一些通过新词发现发现的新词,经过作者手动优化,质量比较高。

词库构建

通过大量原始语料构建词库。

首先,我们需要编写一个迭代容器,这样我们就不必一次将所有语料加载到内存中。迭代器非常灵活。比如我的数据存储在MongoDB中,即:

import pymongo
db = pymongo.MongoClient().weixin.text_articles

class D:
   def __iter__(self):
       for i in db.find().limit(10000):
           yield i['text']

如果数据存储在文本文件中,则可能是:

class D:
   def __iter__(self):
       with open('text.txt') as f:
           for l in f:
               yield l.strip() # python2.x还需要转编码

然后就可以执行了。

from nlp_zero import *
import logging
logging.basicConfig(level = logging.INFO, format = '%(asctime)s - %(name)s - %(message)s')

f = Word_Finder(min_proba=1e-8)
f.train(D()) # 统计互信息
f.find(D()) # 构建词库

通过 Pandas 查看结果:

import pandas as pd

words = pd.Series(f.words).sort_values(ascending=False)

直接从统计词库中创建分词工具:

t = f.export_tokenizer()

t.tokenize(u'今天天气不错')

句子模板构建

和之前一样,我们还需要写一个迭代器,这里不再赘述。因为句子模板的构建是基于词统计的,所以还需要一个分词功能。您可以使用内置分词器或外部分词器,例如口吃。

from nlp_zero import *
import logging
logging.basicConfig(level = logging.INFO, format = '%(asctime)s - %(name)s - %(message)s')

tokenize = Tokenizer().tokenize # 使用自带的分词工具
# 通过 tokenize = jieba.lcut 可以使用结巴分词

f = Template_Finder(tokenize, window=3)
f.train(D())
f.find(D())

通过 Pandas 查看结果:

import pandas as pd

templates = pd.Series(f.templates).sort_values(ascending=False)
idx = [i for i in templates.index if not i.is_trivial()]
templates = templates[idx] # 筛选出非平凡的模版

每个模板都被封装成一个类。

层次分解

基于句子模板分析句子结构。

from nlp_zero import *

# 建立一个前缀树,并加入模版
# 模版可以通过tuple来加入,
# 也可以直接通过“tire[模版类]=10”这样来加入
trie = XTrie()
trie[(None, u'呢')] = 10
trie[(None, u'可以', None, u'吗')] = 9
trie[(u'我', None)] = 8
trie[(None, u'的', None, u'是', None)] = 7
trie[(None, u'的', None, u'是', None, u'呢')] = 7
trie[(None, u'的', None)] = 12
trie[(None, u'和', None)] = 12

tokenize = Tokenizer().tokenize # 使用自带的分词工具
p = Parser(trie, tokenize) # 建立一个解析器

p.parse(u'鸡蛋可以吃吗') # 对句子进行解析
"""输出:
>>> p.parse(u'鸡蛋可以吃吗')
+---> (鸡蛋)可以(吃)吗
|     +---> 鸡蛋
|     |     +---> 鸡蛋
|     +---> 可以
|     +---> 吃
|     |     +---> 吃
|     +---> 吗
"""

为了方便结果的调用和可视化,输出的结果被封装成一个SentTree类。该类具有三个属性:模板(当前主模板)、内容(当前主模板覆盖的字符串)、模块(语义块列表,每个语义块也由SentTree描述)。一般来说,它是根据本文语言结构的假设设计的。

相关阅读Relate

  • 法国签证营业执照翻译件模板 你与申根签证只有一条推送的距离
  • 江苏省增值税发票翻译模板 江苏税务局出口货物退(免)税申报管理系统软件
  • 肄业证书翻译模板 复旦大学学生学业证明文书管理细则(试行)
  • 四级英语作文模板带翻译 大学英语四级翻译模拟训练及答案
  • 社会某信用代码证翻译模板 js验证某社会信用代码,某社会信用代码 验证js,js+验证+社会信用代码证
  • 美国移民证件翻译模板 日语签证翻译聊聊身份证翻译模板
  • 翻译软件模板 人类史上*实用的的文档快速翻译指南
  • 江苏省增值税发票翻译模板 江苏出口货物退(免)税申报管理服务平台
  • 瑞士签证房产证翻译件模板 瑞士探亲签证—就读子女
  • 日语户口本翻译模板 户口本翻译价格_户口本翻译一般多少钱?
  • 句翻译x模板 再谈*小熵原理:“飞象过河”之句模版和语言结构 | 附开源NLP库 www.chinazxzy.com/fymb/6014.html
    
    本站部分内容和图片来源于网络用户和读者投稿,不确定投稿用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的权利,请联系:chinazxzy@163.com,及时删除。
    Go To Top 回顶部
    • 扫一扫,微信在线