理论:词汇编码

4

我使用“词汇编码”一词,因为没有更好的术语。

一个单词可以说是与字母相对应的基本通信单位。Unicode试图为所有已知字母表中的每个字母分配一个数值。一个语言中的字母在另一种语言中可能是一个符号。目前,Unicode 5.1为这些符号分配了超过100,000个值。现代英语中大约有180,000个单词,据说掌握大约2,000个单词的词汇量就足以进行一般性的交流。一个“词汇编码”将对每个单词进行编码而不是每个字母,并将它们包含在一个句子中。

// An simplified example of a "Lexical Encoding"
String sentence = "How are you today?";
int[] sentence = { 93, 22, 14, 330, QUERY };

在这个例子中,字符串中的每个令牌都被编码为一个整数。这里的编码方案仅基于单词使用的一般统计排名分配了一个int值,并将一个常量分配给问号。
最终,一个单词既有拼写又有意义。任何“词汇编码”都应该保留整个句子的含义和意图,并且不应该是特定语言的。英语句子将被编码为{{link1:“...语言中立的原子意义元素...”}},然后可以用结构化的句法形式和语法结构重新组合成任何语言。
还有哪些“词汇编码”技术的例子?

如果你对单词使用统计数据的来源感兴趣:
http://www.wordcount.org


3
一开始似乎是一个清醒和逻辑的概念,但毫无疑问,这个问题在很多层面上都是错误的——从词汇到语用。它违背了语言理解的本质。 - logout
1
请注意,语言之间的词序可能会有所不同;例如,日语中没有英语的各种特征(如冠词 - a,an,the)。在20世纪早期,人们使用编码本来传输更复杂的短语(因为电报按字计费)。一个单词可以表示整个短语甚至是整个句子...请参阅卡恩的《密码破译者》(http://www.amazon.com/Codebreakers-Comprehensive-History-Communication-Internet/dp/0684831309)进行讨论。 - Jonathan Leffler
8个回答

6
这个问题更多地涉及语言学而非编程,但对于高度综合的语言(其单词由多个组合形态素构成),尝试“编号”所有可能的单词可能是一个极其复杂的问题,而不像英语这样至少有些孤立的语言,或者像汉语这样高度分析的语言,可以很容易地根据其构成的字形来分解和计数单词。
也就是说,在某些语言中,单词可能无法根据其组成的字形轻松分解和计数。
这篇维基百科文章Isolating languages可能有助于解释这个问题。

3

如果您想自己发明一种方法,那很容易。将每个单词转换为规范的字节流(例如,小写分解UCS32),然后将其哈希为整数。32位可能足够了,但如果不够的话,64位肯定足够。

在您因为我给出了一个讽刺的答案而生气之前,请考虑Unicode的目的只是为每个字符分配一个唯一的标识符。并不是为了对它们进行排名、排序或分组,而只是将每个字符映射到一个所有人都同意的唯一标识符上。


3
这个想法存在几个主要问题。在大多数语言中,单词的含义和与之相关联的单词很快就会改变。
在单词被分配一个数字之前,单词的含义就已经发生了变化。例如,“gay”这个词曾经只表示“快乐”或“愉快”,但现在它主要用来表示同性恋。另一个例子是词素“thank you”,它最初来自德语“danke”,而后者只是一个单词。还有一个例子是“Good bye”,它是“God bless you”的缩写。
另一个问题是,即使在任何时间点上对一个单词进行快照,该单词的含义和用法也会在同一省份内引起争议。在编写字典时,负责学术的人们为了一个单词可能会争论不休。
简而言之,在现有语言中无法实现这一想法。您必须考虑发明一种专门用于此目的的语言,或使用已经发明的相当静态的语言,例如国际语或世界语。然而,即使是这些语言也不能完美地定义静态词素在一个始终标准的词汇表中的作用。
即使在中文中,字符到含义的映射也只是大致的,也无法实现。许多字符的含义会根据上下文以及它们前面或后面的字符而改变。
当您尝试在不同语言之间进行翻译时,问题变得更加严重。英语中可能有一个单词,在各种情况下都可以使用,但在其他语言中不能直接使用。例如,“free”这个词。在西班牙语中,可以使用“libre”表示“自由”(如言论自由),或使用“gratis”表示“免费”(如啤酒免费),如果用错误的词替代“free”会显得非常滑稽。
还有一些单词更难确定其含义,例如韩语中的“beautiful”。当称赞女孩漂亮时,有几个候选词可以替换;但是当称赞食物美味时,除非你指的是食物好看,否则还有几个完全不同的候选词可供选择。
总之,虽然我们只在英语中使用约200,000个单词,但在某些方面,我们的词汇量实际上更大,因为我们给同一个单词分配了许多不同的含义。这些问题同样适用于世界语和国际语,以及任何其他有意义的对话语言。人类的语言不是一个定义明确、运作良好的机器。因此,尽管您可以创建这样一个词汇表,其中每个“单词”都具有其自己独特的含义,但对于使用当前技术将任何人类语言翻译成您的特殊标准化词汇表的机器来说,这将非常困难,几乎是不可能的。
这就是为什么机器翻译仍然很糟糕,并且将在很长一段时间内如此。如果您能做得更好(我希望您能),那么您应该考虑获得某种奖学金和/或大学/政府资助,工作向博士学位迈进;或者只是赚一大笔钱,无论

2
系统如何处理名词的复数形式或动词的变位?它们是否有自己的“Unicode”值?

2
作为一个翻译方案,这种方法可能需要更多的工作才能实现。你可能认为可以给每个单词分配一个数字,然后机械地将其翻译成另一种语言。但实际上,语言存在多个拼写相同的单词,例如“the wind blew her hair back”和“wind your watch”。
对于传输文本,你可以针对每种语言使用不同的字母表,这样做是可行的,尽管我想知道与使用可变长度字典(如ZIP所使用的)相比,你会获得什么好处。

2
这是一个有趣的问题,但我怀疑您提出这个问题的原因是错误的。您是不是认为“词汇”Unicode可以将句子分解为语言中立的意义原子,并能够在其他具体语言中重新构建它们?也许作为实现通用翻译器的手段?
即使您可以使用“词汇Unicode”编码和存储英语句子,您也不能指望阅读它并神奇地将其保留在中文中,同时保持其含义不变。
然而,您对Unicode的类比非常有用。
请记住,Unicode虽然是一种“通用”代码,但并不包含字符的发音、含义或用法。每个代码点都指向特定语言(或者说是一组语言使用的脚本)中的特定字形。它在字形的视觉表示级别上是基本的(在样式、格式和字体的范围内)。拉丁字母“A”的Unicode代码点就是那样。它是拉丁字母“A”。它不能自动呈现为阿拉伯字母Alif(ﺍ)或印度字母'A'(अ),例如。
按照Unicode的类比,您的词汇Unicode将为每种语言中的每个单词(单词形式)设置代码点。Unicode具有特定脚本的代码点范围。您的词汇Unicode将不得不为每种语言设置代码范围。即使不同语言中的不同单词具有相同的含义(同义词),也必须具有不同的代码点。同一单词具有不同含义或发音(同音异义词)也必须具有不同的代码点。
在Unicode中,对于某些语言(但并非全部),如果相同的字符根据其在单词中的位置而具有不同的形状-例如在希伯来语和阿拉伯语中,字形在单词结尾处发生变化-则它具有不同的代码点。同样,在您的词汇Unicode中,如果一个单词根据其在句子中的位置而具有不同的形式,则可能需要自己的代码点。
也许为英语语言想出代码点的最简单方法是基于牛津英语词典的特定版本,并按顺序为每个单词分配一个唯一的代码。您将不得不使用不同的代码来表示相同单词的不同含义,并且您将不得不针对不同的形式使用不同的代码-例如,如果相同的单词可以用作名词和动词,则需要两个代码。
然后,您将不得不为要包括的每种其他语言执行相同的操作-使用该语言的最权威词典。
这项任务可能比值得努力的价值还要大。如果您决定包括所有世界上使用的语言,以及一些历史上死亡的语言和一些虚构的语言-就像Unicode那样-您最终将得到一个非常庞大的代码空间,您的代码必须极其宽以容纳它。在压缩方面,您不会获得任何优势-与以原始语言表示为字符串的句子相比,用代码表示同样的句子需要更多的空间。
附注:对于那些认为这是一个不可能完成的任务因为单词意思会改变的人,我并不认为这是一个问题。使用Unicode类比,字母的使用已经改变(尽管没有单词含义变化得快),但这并不影响Unicode存在'中世纪't'读作'y'的事实。 Unicode有't','h'和'y'的代码点,它们各自都起着作用。
附注2:实际上,'oe'也可以写成'œ'或者在德语中'ss'可以被写成'ß',这让Unicode感到略微挂念。

1

这是一个有趣的小练习,但我建议您将其视为自然语言中类型和标记之间差异概念介绍而已。

类型是表示所有实例的单个单词实例。标记是每个单词实例的单个计数。让我用以下示例来解释:

“约翰去了面包店。他买了面包。”

这里是该示例的一些频率计数,其中计数表示标记数量:

John: 1
went: 1
to: 1
the: 2
store: 1
he: 1
bought: 1
bread: 2

请注意,“the”被计算了两次——有两个“the”的标记。但是请注意,虽然有十个单词,但只有八个这样的单词-频率对。将单词分解为类型并与其标记计数配对。
类型和标记在统计自然语言处理中非常有用。另一方面,“词汇编码”我会小心。这是一个过渡到更加老式的自然语言处理方法,其中预编程和理性主义盛行。我甚至不知道是否有任何统计机器翻译实际上会为单词分配特定的“地址”。首先,单词之间有太多的关系,无法建立任何深思熟虑的数字本体论,如果我们只是将数字投射到单词上以对它们进行分类,我们应该考虑像内存管理和分配速度等问题。
我建议查看使用Python编写的自然语言工具包NLTK,以获得更全面的自然语言处理及其实际用途介绍。

0
其实,你只需要大约600个单词就能拥有一个相当不错的词汇量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接