我在一个大型机器学习/nlp项目上工作,我在其中的一小部分工作上陷入了困境。(下午我,如果你想知道我到底在做什么。)
我试着用javascript编写一个程序,它只通过使用字母表中的所有字母来学习生成有效单词。
我所拥有的是一个500个不同单词的数据库。它是一个很大的JS对象,结构如下(单词是德语):
database = {
"um": {id: 1, word: "um", freq: 10938},
"oder": {id: 2, word: "oder", freq: 10257},
"Er": {id: 3, word: "Er", freq: 9323},
...
}
"freq"
明显是指频率(也许这个值有时会变得很重要,但我目前不使用它,所以请忽略它。)我的程序目前的工作方式是:
在第一次迭代中,它生成一个长度介于2到13个字母之间的完全随机单词,并在数据库中搜索它。如果它在那里,单词中的每一个字母都会得到一个好的评价,如果它不在那里,它们会得到一个坏的评价。同时,单词长度也会被评分。如果单词是有效的,它的单词长度得到一个好的评价,如果不是,它的单词长度得到一个坏的评价。
在第一次迭代之后的迭代中,它不会生成具有随机字母和随机单词长度的单词它使用基于字母等级和单词长度的概率。
例如,假设它在前100次迭代之后发现了单词“the”、“so”和“if”。因此,字母“t”、“h”、“e”和字母“s”、“o”以及字母“i”、“f”的评分都很高,单词2和3的长度也很高因此,在下一次迭代中生成的单词更可能包含这些评级良好的字母,而不是评级较差的字母。
当然,程序还会检查当前生成的单词是否已生成,如果已生成,则该单词不会再次被评分,并生成一个新单词。
从理论上讲,它应该根据自己的特点来学习最佳的字母频率和最佳的字长频率,有时只能生成有效的单词。
是啊。当然这不管用。在最初的几次迭代中,它会变得更好,但一旦找到所有两个字母的单词,它就会变得更糟我认为我做这件事的方式是错误的。实际上我已经试过了,经过5000次迭代之后,我为您提供了一个(不是很漂亮的)图表:
红线:生成错误的单词
绿线:生成右字
是啊。这里有什么问题?我做错机器学习了吗你有解决办法吗一些算法或trie系统?
注:我知道this,但它不在JS中,我不理解它,我不能评论它。
最佳答案
另一种方法是使用Markov Model。
首先在字典中计算字母频率和单词长度频率然后,创建一个单词:
在1与最大现有字长之间选取加权随机数(见下文)。这就是你要生成多少个字母。
对于单词中的每个字母,选择一个加权随机字母并将其添加到单词中。
这是一个0阶马尔可夫模型。这是基于语料库中出现字母的频率。它可能会给你的结果是类似的系统,你有。
一阶马尔可夫模型将得到更好的结果,在该模型中,计算bigram(两个字母的排列)频率而不是计算字母频率。所以要选择第一个字母,你只能从用来开始单词的大字中选择对于后续字母,请选择一个紧跟先前生成的字母的字母这会给你比0阶模型更好的结果。
二阶模型的效果出人意料。例如,请参阅我的博客文章Shakespeare vs. Markov。
加权随机数是指“随机”选择的数字,但为了反映某种分布而倾斜。例如,在英语中,字母“E”大约出现在12.7%的时间内。t'出现在9.06%的时间,等等。参见https://en.wikipedia.org/wiki/Letter_frequency所以你希望你的加权随机数发生器的输出来近似这个分布。或者,在你的情况下,你希望它接近你语料库中的分布。请参见Weighted random numbers以获取如何完成此操作的示例。
关于javascript - 给定字典和字母列表,使程序学习生成有效的单词| Java脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43405081/