Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
给定字典和字母列表,让程序学习生成有效单词| Javascript_Javascript_Algorithm_Machine Learning_Nlp_Artificial Intelligence - Fatal编程技术网

给定字典和字母列表,让程序学习生成有效单词| Javascript

给定字典和字母列表,让程序学习生成有效单词| Javascript,javascript,algorithm,machine-learning,nlp,artificial-intelligence,Javascript,Algorithm,Machine Learning,Nlp,Artificial Intelligence,我正在从事一个大型的机器学习/nlp项目,我被困在其中的一小部分。(如果你想知道我在做什么,请PM我。) 我尝试用Javascript编写一个程序,该程序只通过使用字母表中的所有字母来学习生成有效单词 我所拥有的是一个有50万个不同单词的数据库。它是一个大的JS对象,结构如下(单词是德语): “freq”显然是指频率。(也许这个值有时很重要,但我目前不使用它,所以忽略它。) 我的程序目前的工作方式是: 在第一次迭代中,它生成一个长度在2到13个字母之间的完全随机单词,并在数据库中搜索它。如果它

我正在从事一个大型的机器学习/nlp项目,我被困在其中的一小部分。(如果你想知道我在做什么,请PM我。)

我尝试用Javascript编写一个程序,该程序只通过使用字母表中的所有字母来学习生成有效单词

我所拥有的是一个有50万个不同单词的数据库。它是一个大的JS对象,结构如下(单词是德语):

“freq”
显然是指频率。(也许这个值有时很重要,但我目前不使用它,所以忽略它。)
我的程序目前的工作方式是: 在第一次迭代中,它生成一个长度在2到13个字母之间的完全随机单词,并在数据库中搜索它。如果它在那里,单词中的每个字母都会得到一个好的评价,如果它不在那里,他们会得到一个坏的评价。此外,单词长度也会被分级。如果单词是有效的,它的单词长度会得到一个好的评级,如果不是,它的单词长度会得到一个坏的评级

在第一次迭代之后的迭代中,它不会生成包含random字母和random单词长度的单词。它使用基于字母评级和单词长度的概率

例如,假设它在前100次迭代之后发现了单词“the”、“so”和“if”。因此,字母“t”、“h”、“e”和字母“s”、“o”以及字母“i”、“f”的评级良好,单词长度2和3的评级也良好。因此,在下一次迭代中生成的单词更有可能包含这些评级好的字母,而不是评级差的字母

当然,程序也会检查当前生成的单词是否已经生成,如果已经生成,那么这个单词就不会再次被评级,它会生成一个新单词

理论上,它应该自己学习最佳字母频率和最佳单词长度频率,有时只生成有效单词

嗯。这当然行不通。在最初的几次迭代中,它会变得更好,但一旦它找到了所有两个字母的单词,它就会变得更糟。我认为我这样做的方式是错误的。实际上我已经尝试过了,在5000次迭代之后,我为您绘制了一个(不太漂亮的)图表:

红线:生成了错误的单词

绿线:生成正确的单词
是 啊这里有什么问题?我的机器学习做错了吗?你有解决办法吗?一些算法还是trie系统


PS:我知道,但它不在JS中,我不理解它,也不能对此发表评论。

另一种方法是使用

从计算字典中的字母频率和单词长度频率开始。然后,要创建一个单词:

  • 选择一个介于1和最大现有字长之间的加权随机数(见下文)。这就是你要产生的字母数量
  • 对于单词中的每个字母,选择一个加权随机字母并将其添加到单词中
  • 这是一个0阶马尔可夫模型。这是基于语料库中字母出现的频率。它可能会给你的结果,类似于你的系统

    从一阶马尔可夫模型中,您将得到更好的结果,在该模型中,您不计算字母频率,而是计算二元字母(两个字母排列)频率。因此,要选择第一个字母,您只能从用于单词开头的双字母表中进行选择。对于后续字母,请选择前面生成的字母后面的字母。这会给你比order-0模型更好的结果

    二阶模型出人意料地有效。例如,请参阅我的博客文章


    加权随机数是“随机”选择的数字,但为了反映某种分布而倾斜。例如,在英语中,字母“e”的出现率约为12.7%t'发生率为9.06%,等等。请参阅。所以你希望你的加权随机数生成器的输出近似于这个分布。或者,在您的例子中,您希望它近似于语料库中的分布。请参阅,以获取如何执行此操作的示例。

    哪些是“错误”单词的示例?数据库中未找到的单词相对而言,数据库中未找到的单词与被认为正确的单词有何不同?机器与数据库中单词的字符有多密切的关系?例如“嗨”、“hl”或“你好”、“你好”。只有“对”或“错”字?您是否尝试过实现模糊逻辑来解释一系列可能类似的字符,这些字符可以表示为“右”字母的值?机器输出的解释类似于现代语言。在模棱两可的语言中,新术语不断产生。有些语言不是模棱两可的;还有一些不是“写”成“文字”的。机器“学习”“正确”响应的逻辑是什么?您正在学习“字符级语言模型”。搜索它,找出其他人做了什么。好的,首先,谢谢!关于加权字母:据我所知,我已经使用了这种技术,但是动态地根据之前生成的正确单词中字母的出现情况生成加权列表,但是:谢谢你的马尔可夫模型!在实际生成单词之前,我已经考虑过计算字母频率和单词长度频率,但我从来都不知道如何做到这一点……现在我将尝试order-2模型!谢谢你对这个话题的研究,很棒的博客@纳诺米拉图斯:我认为2号订单或3号订单可以满足你的要求。我的博客没有展示一个order-3文本的例子,但它主要是语料库中可识别的单词。
    database = {
        "um": {id: 1, word: "um", freq: 10938},
        "oder": {id: 2, word: "oder", freq: 10257},
        "Er": {id: 3, word: "Er", freq: 9323},
        ...
    }