Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 马尔可夫链文本生成_Java_Algorithm - Fatal编程技术网

Java 马尔可夫链文本生成

Java 马尔可夫链文本生成,java,algorithm,Java,Algorithm,在我的数据结构类中,我们刚刚被分配了一个新项目——用马尔可夫链生成文本 概述 给定一个输入文本文件,我们创建一个长度为n个字符的初始种子。我们将其添加到输出字符串中,并根据频率分析选择下一个字符 这是猫,有两只狗 我的解决方案 我有3个类,Node、ConcreteTrie和Driver 当然,ConcreteTrie类不是传统意义上的Trie。以下是它的工作原理: 给出k=2的句子: 这是猫,有两只狗 我生成节点Th,hi,is,…+,gs,s。 每个节点都有子节点,子节点是它们后面的字母。例

在我的数据结构类中,我们刚刚被分配了一个新项目——用马尔可夫链生成文本

概述

给定一个输入文本文件,我们创建一个长度为n个字符的初始种子。我们将其添加到输出字符串中,并根据频率分析选择下一个字符

这是猫,有两只狗

我的解决方案

我有3个类,Node、ConcreteTrie和Driver

当然,ConcreteTrie类不是传统意义上的Trie。以下是它的工作原理:

给出k=2的句子:

这是猫,有两只狗

我生成节点Th,hi,is,…+,gs,s。 每个节点都有子节点,子节点是它们后面的字母。例如,节点Th将有子节点i和e。我在每个节点中维护计数,以便稍后生成选择下一个字母的概率

我的问题:

首先,完成这个项目最有效的方法是什么?我的解决方案似乎很快,但我真的很想让我的教授大吃一惊。(在我的上一个项目编辑距离问题的变体中,我做了A*、遗传算法、BFS和模拟退火——我知道这个问题是NP难的)


第二,这项任务的意义是什么?这似乎与我们在课堂上所讲的内容没有多大关系。我们应该学习什么?

关于本作业与您在课堂上所学内容的相关性(您的第二个问题)。“数据结构”课程的理念是让学生了解CS中经常遇到的许多结构:列表、堆栈、队列、散列、各种类型的树、一般的图、各种信条和贪婪的矩阵等,并对其常见实现提供一些见解,它们的优点和缺点以及它们的各个应用领域。
由于大多数游戏/谜题/问题都可以映射到这些结构中的某一组,因此讲座和作业都不乏主题您的课程似乎很有趣,因为在关注这些结构的同时,您也有机会发现真正的应用程序
例如,“猫和两条狗”这件事就是对语言学中应用的统计模型的介绍。你的好奇心和动机促使你建立了与马尔可夫模型的关系,这是一件好事,因为在毕业前,你很可能还会遇到“马尔可夫”几次;-)当然,在CS或相关领域的职业生涯中。所以,是的看起来您在许多应用程序等方面都在胡闹。但只要您了解在特定情况下选择什么结构和算法,您就不会浪费时间

现在,一些关于作业可能方法的提示
trie似乎是对这类问题的自然支持。也许你可以问问自己,如果你不得不说一整本书,而不是这句短句,那么这种方法将如何扩展。这似乎主要是线性的,尽管这取决于trie中三个跃点上的每个选择(对于这个二阶马尔可夫链):随着选择数量的增加,选择路径的效率可能会降低。
用于建立索引的一种可能的替代存储是一个stochatisc矩阵(实际上是一个“普通”矩阵,如果在统计数据收集过程中只有稀疏矩阵,那么当您规范化每一行或每一列(取决于您的设置)时,它在最后变成随机矩阵),总计为一(100%)。这样的矩阵大约为729 x 28,并且允许在一次操作中对两个字母的元组及其关联的后续字母进行索引。(包括“启动”和“停止”信号、详细信息,我得到了28分…
这种更有效的索引的成本是使用额外的空间空间方面trie非常有效,仅有效存储现有的字母三元组组合,但矩阵会浪费一些空间(你打赌,即使索引了比“狗/猫”句子多得多的文本,最终它的填充空间也会非常稀疏。)
虽然某些算法/结构在这两方面都比其他算法/结构好很多,但这种大小与CPU之间的折衷是非常常见的。。。此外,如果将问题改为基于前面三个字符的字母选择,那么矩阵方法将无法很好地扩展
尽管如此,也许可以将矩阵作为替代实现。这门课的精神是尝试各种结构,看看它们为什么/在哪里优于其他结构(在特定任务的背景下)。
您可以做的一个小的附带步骤是根据字母对(或三元组)的概率创建一个矩阵:trie和矩阵都包含所有必要的数据;矩阵及其所有有趣的属性可能更适合这种情况。

玩得开心

您可以对字符使用双随机数方法,但通常它适用于单词,因为如果我们像您的例子那样只使用简单的生成器,输出将更有意义)

1) 依我看,你做得很好。但可能您应该尝试稍微随机选择下一个节点?例如,从最高的5个节点中选择随机节点。我的意思是,如果您总是选择概率最高的节点,您的输出字符串将过于统一


2) 我在大学里做了完全相同的家庭作业。我认为重点是要向学生展示马尔可夫链的强大功能,但如果不深入研究生成器的应用领域输出,这将是荒谬的

也许你的教授是一个非常好的用户,他想看看你在课堂上是否注意了,以及你能解释得有多好
Initial seed: "Th"
Possible next letters -- i, e, e
Therefore, probability of choosing i is 1/3, e is 2/3.

Now, say we choose i. We add "i" to the output string. Then our seed becomes
hi and the process continues.