今天大多数成功的语言解析器都是基于统计的,这就是(例如)谷歌翻译的工作原理。你要做的是获得一个大型的语义标记语料库,然后开始浏览单词图表。语言上有效的英语句子集大于生成语法(一种较旧的方法),但大型语料库将为您提供大量可行的句子模板。你可以通过任何数据遍历技术从你的包中造句,从随机游走到遗传算法。让我们知道你在做什么!
这里有一组很棒的资源可供开始:斯坦福统计自然语言处理和基于语料库的计算语言学资源
回应下面的 OP 评论:要生成一个句子,你必须有一个有效句子的抽象表示。一个简单的例子是生成语法中的主语动词宾语。你也可能得到主语动词形容词宾语。问题是你可以用语法正确的废话来填写它,例如“我吃了饥饿的苹果”。统计分析会告诉你的是,“饥饿的苹果”是一个你几乎从未见过的组合——它不太可能出现在真正的英语(你的语料库)中,所以甚至不必知道它的含义,我可以尽可能消除它句子。如果您正在编写语法检查器,您可能会在该单词对下划线,因为它是有问题的。
由于您正在编写一个句子生成器,您只需要反转该过程 - 一个简单的可能性是简单地生成大量单词的随机组合,然后根据您的数据库检查它们以查看单词链是否都满足一定的可能性阈值,例如 80%。另一种选择是在遗传算法中将单个单词链视为基因,经过几代之后,像“饥饿的苹果”这样的链将消失,取而代之的是像“红苹果”这样更成功的基因。使用像您提到的那样的小型“词袋”,您不需要花哨,您可以毫无问题地测试每个可能的句子 numwords < n 。当您的词袋太大而无法详尽计算时,您只需要花哨的句子搜索算法。
上面的链接确实有几个您可以下载和使用的标记语料库,以及大量用于标记您自己的语料库的示例程序。但是,如果这只是一个好奇的项目,你确实想保持简单。让我提出另一个建议——可用的最大语料库之一是 Google 的网络索引。您在谷歌搜索中加上引号的任何句子或短语都会返回一些点击。例如,“red apple”返回超过 100 万次点击,而“hungry apple”仅返回 11,000 次。您可以使用它为您的句子的有效性构建一个小的统计标记,并带有一个小词袋。如果统计过程太复杂以至于您无法实施,而是考虑用词性标记你的词袋(研究词性标记)并为你的程序提供各种抽象句子模板——你仍然会得到像“一个人会吃一个饥饿的苹果”这样的句子,但是根据您的需要,这可能就足够了。:)
PS 如果你的词袋中没有“an”这个词,你看起来仅限于泰山语法和吃人苹果的世界:)