首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

给我看你的流程图而藏起你的表,我将仍然是莫名其妙。如果给我你的表,那么我将不再要你的流程图,因为它们太明显了。—Frederick P. Brooks, Jr., 《人月神话》

以上从Brooks的经典书中摘录的内容想说的是,数据结构设计是程序构造过程的中心环节。一旦数据结构安排好了,算法就像是瓜熟蒂落,编码也比较容易。

这种观点虽然有点过于简单化,但也不是在哄骗人。在前一章里我们考察了各种基本数据结构,它们是许多程序的基本构件。在这一章中,我们将组合这些结构,要完成的工作是设计和实现一个中等规模的程序。我们将说明被处理的问题将如何影响数据结构,从这里还可以看到,一旦数据结构安排好之后,代码将会如何自然地随之而来。

我们的观点的另一个方面是:程序设计语言的选择在整个设计过程中,相对而言,并不是那么重要。我们将抽象地设计这个程序,然后用C、C++、Java、Awk 和Perl把它写出来。由不同实现之间的比较,可以看出语言在这里能有什么帮助或者妨碍,以及它们并不那么重要的各种情况。程序的设计当然可以通过语言来装饰,但是通常不会为语言所左右。

我们要选择的问题并不是很常见的,但它在基本形式上又是非常典型的:一些数据进去,另一些数据出来,其处理过程并不依赖于多少独创性。

我们准备做的就是产生一些随机的可以读的英语文本。如果随便扔出来一些随机字母或随机的词,结果当然是毫无意义的。例如,一个随机选取字母(以及空格,用作词之间的分隔)的程序可能产生:

没人会觉得这有什么意思。如果以字母在英语里出现的频率作为它们的权重,我们可能得到下面这样的内容:

这个也好不到哪儿去。采用从字典里随机选择词的方式也弄不出多少意思来:

为了得到更好一些的结果,我们需要一个带有更多内在结构,例如包含着各短语出现频率的统计模型。但是,我们怎么才能得到这种统计呢?

我们当然可以抓来一大堆英语材料,仔细地研究。但是,实际上有一种更简单也更有意思的方法。这里有一个关键性的认识:用任何一个现成的某种语言的文本,可以构造出由这个文本中的语言使用情况而形成的统计模型。通过该模型生成的随机文本将具有与原文本类似的统计性质。

3.1 马尔可夫链算法

完成这种处理有一种非常漂亮的方法,那就是使用一种称为马尔可夫链算法的技术。我们可以把输入想像成由一些互相重叠的短语构成的序列,而该算法把每个短语分割为两个部分:一部分是由多个词构成的前缀,另一部分是只包含一个词的后缀。马尔可夫链算法能够生成输出短语的序列,其方法是依据(在我们的情况下)原文本的统计性质,随机性地选择跟在前缀后面的特定后缀。采用三个词的短语就能够工作得很好——利用连续两个词构成的前缀来选择作为后缀的一个词:

设置w1和w2为文本的前两个词

输出w1和w2

循环:

随机地选出w3,它是文本中w1w2的后缀中的一个

打印w3

把w1和w2分别换成w2和w3

重复循环为了说明问题,假设我们要基于本章开头的引语里的几个句子生成一些随机文本。这里采用的是两词前缀:

下面是一些输入的词对和跟随它们之后的词:输入前缀跟随的后缀词

处理这个文本的马尔可夫算法将首先打印出Show your,然后随机取出flowcharts或table。如果选中了前者,那么现在前缀就变成your flowcharts,而下一个词应该是and或will。如果它选取tables,下一个词就应该是and。这样继续下去,直到产生出足够多的输出,或者在找后缀时遇到了结束标志。

我们的程序将读入一段英语文本,并利用马尔可夫链算法,基于文本中固定长度的短语的出现频率,产生一段新文本。前缀中词的数目是个参数,上面用的是2。如果将前缀缩短,产生出来的东西将趋向于无聊词语,更加缺乏内聚力;如果加长前缀,则趋向于产生原始输入的逐字拷贝。对于英语文本而言,用两个词的前缀选择第三个是一个很好的折衷方式。看起来它既能重现输入的风味,又能加上程序的古怪润饰。什么是一个词?最明显的回答是字母表字符的一个序列。这里我们更愿意把标点符号也附着在词后,把“words”和“words.”看成是不同的词,这样做将有利于改进闲话生成的质量。加上标点符号,以及(间接的)语法将影响词的选择,虽然这种做法也可能会产生不配对的引语和括号。我们将把“词”定义为任何实际位于空格之间的内容,这对输入语言并没有造成任何限制,但却将标点符号附到了词上。许多语言里都有把文本分割成“空白界定的词”的功能,

这个功能也很容易自己实现。

根据这里所采用的方法,输出中所有的词、所有的两词短语以及所有三个词的短语都必然

是原来输入中出现过的,但是,也会有许多四个词或更多个词的短语将被组合产生出来。下面

几个句子是由我们在本章里将要开发的程序生成的,给它提供的文本是艾尼思特·海明威的《太阳照样升起》的第4章:

我们很幸运,在这里标点符号没出问题。实际中却未必总能这样。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论