如何成功实现用于生成句子的下一个单词的马尔可夫模型?
How to succesfully implement a markov model for generating the next word of a sentence?
我正在开发 javascript 程序,该程序接受文本并使用它来生成句子
乍一看似乎有道理。
我正在实施马尔可夫模型。
我有例如:
[{word:"hello", prob: 0.5}, {word: "world", prob: 0.25},...]
我的模型要复杂得多,我不打算解释每个细节。
我想知道的是,当知道某个词出现的概率时,如何在Javascript中创建造句?
我目前所做的似乎是这样做的,但当真正考虑它时,它只是随机的。
我尝试的是将 table 中每个单词的概率值与从 0 到 1 的随机选择值进行比较。
例如我会选择
randomValue = Math.Random().toFixed(2)
使用 toFixed 得到的值是 0.33 而不是 0.3455343.... 然后我会将它与每个单词的不同概率值进行比较,看看它是否匹配。一旦匹配,我就选择那个词。
至少让单词按概率选择而不是我所做的似乎只是随机选择的正确方法是什么。
我对马尔可夫模型不是很熟悉,但我觉得我可以在这里提供帮助 - 特别是考虑到到目前为止这里还没有答案。
首先,您提供的代码:
randomValue = Math.Random().toFixed(2)
有几个问题。 random 中的 "R" 应该是小写的,而 toFixed(2) returns 是一个字符串,而不是一个数字。该行的正确版本是:
var randomValue = Number(Math.random().toFixed(2));
也就是说,要纯粹根据最高概率来选择下一个单词,无论如何您都不需要使用那行代码。你会这样做:
var nextWordProbabilities = [{word:"hello", prob: 0.5}, {word: "world", prob: 0.25}];
nextWordProbabilities.sort(function(a, b){
if(a.prob < b.prob)return 1;
if(a.prob > b.prob)return -1;
return 0;
});
var nextWord = nextWordProbabilities[0].word;
如果你想加入一点随机性,这样你就不会总是得到恰好是最高概率的词,而可能是一个刚好接近最高概率的词,你可以继续然后在前面的代码块之后添加:
var TENDENCY_TOWARDS_MOST_PROBABLE_WORDS = .5;
for(var i = 0; i < nextWordProbabilities.length; i++){
if(Math.random() > TENDENCY_TOWARDS_MOST_PROBABLE_WORDS){
nextWord = nextWordProbabilities[i].word;
}
}
我也不确定您是如何确定何时结束句子的。如果你不只是连续做一定数量的单词,当最可能的单词不是超级可能的时候结束句子可能是个好主意,就像这样:
if(nextWordProbabilities[0].prob < .2){
//end the sentence
}
希望这对您有所帮助。
试试这个
var b =Math.floor(Math.random() * 6);
if (b=="1"){var a=("i ")}
else if(b=="2"){var a=("a bean ")}
else if(b=="3"){var a =("a xbox ")}
else if(b=="0"){var a =("sport drink ")}
else if (b=="4"){var a =("some grass ")}
else if(b=="5"){var a =("a rock ")}
var e=Math.floor(Math.random() * 5);
if(e=="0"){var p =("fell on ")}
else if(e=="1"){var p =("jumped on ")}
else if(e=="2"){var p =("bounced over ")}
else if(e=="3"){var p =("slid on")}
else if(e=="4"){var p =("slipped on")}
var n=Math.floor(Math.random() * 7);
if(n=="0"){var q=("a mountain ")}
if(n=="1"){var q =("a candlestick ")}
else if(n=="2"){var q =("a raw potato ")}
else if(n=="3"){var q=("a book ")}
else if(n=="4"){var q=("a glass bottle ")}
else if(n=="5"){var q =("water ")}
else if(n=="6"){var q =("fish soup ")}
var o=Math.floor(Math.random() * 4);
if(o=="0"){var v =("in the dark")}
if (o=="1"){var v =("in the light")}
if(o=="2"){var v=("in the middle of nowhere")}
if(o=="3"){var v=("in a giant lemon")}
document.write(a+p+q+v)
document.open()
我正在开发 javascript 程序,该程序接受文本并使用它来生成句子 乍一看似乎有道理。
我正在实施马尔可夫模型。
我有例如:
[{word:"hello", prob: 0.5}, {word: "world", prob: 0.25},...]
我的模型要复杂得多,我不打算解释每个细节。
我想知道的是,当知道某个词出现的概率时,如何在Javascript中创建造句?
我目前所做的似乎是这样做的,但当真正考虑它时,它只是随机的。 我尝试的是将 table 中每个单词的概率值与从 0 到 1 的随机选择值进行比较。
例如我会选择
randomValue = Math.Random().toFixed(2)
使用 toFixed 得到的值是 0.33 而不是 0.3455343.... 然后我会将它与每个单词的不同概率值进行比较,看看它是否匹配。一旦匹配,我就选择那个词。
至少让单词按概率选择而不是我所做的似乎只是随机选择的正确方法是什么。
我对马尔可夫模型不是很熟悉,但我觉得我可以在这里提供帮助 - 特别是考虑到到目前为止这里还没有答案。
首先,您提供的代码:
randomValue = Math.Random().toFixed(2)
有几个问题。 random 中的 "R" 应该是小写的,而 toFixed(2) returns 是一个字符串,而不是一个数字。该行的正确版本是:
var randomValue = Number(Math.random().toFixed(2));
也就是说,要纯粹根据最高概率来选择下一个单词,无论如何您都不需要使用那行代码。你会这样做:
var nextWordProbabilities = [{word:"hello", prob: 0.5}, {word: "world", prob: 0.25}];
nextWordProbabilities.sort(function(a, b){
if(a.prob < b.prob)return 1;
if(a.prob > b.prob)return -1;
return 0;
});
var nextWord = nextWordProbabilities[0].word;
如果你想加入一点随机性,这样你就不会总是得到恰好是最高概率的词,而可能是一个刚好接近最高概率的词,你可以继续然后在前面的代码块之后添加:
var TENDENCY_TOWARDS_MOST_PROBABLE_WORDS = .5;
for(var i = 0; i < nextWordProbabilities.length; i++){
if(Math.random() > TENDENCY_TOWARDS_MOST_PROBABLE_WORDS){
nextWord = nextWordProbabilities[i].word;
}
}
我也不确定您是如何确定何时结束句子的。如果你不只是连续做一定数量的单词,当最可能的单词不是超级可能的时候结束句子可能是个好主意,就像这样:
if(nextWordProbabilities[0].prob < .2){
//end the sentence
}
希望这对您有所帮助。
试试这个
var b =Math.floor(Math.random() * 6);
if (b=="1"){var a=("i ")}
else if(b=="2"){var a=("a bean ")}
else if(b=="3"){var a =("a xbox ")}
else if(b=="0"){var a =("sport drink ")}
else if (b=="4"){var a =("some grass ")}
else if(b=="5"){var a =("a rock ")}
var e=Math.floor(Math.random() * 5);
if(e=="0"){var p =("fell on ")}
else if(e=="1"){var p =("jumped on ")}
else if(e=="2"){var p =("bounced over ")}
else if(e=="3"){var p =("slid on")}
else if(e=="4"){var p =("slipped on")}
var n=Math.floor(Math.random() * 7);
if(n=="0"){var q=("a mountain ")}
if(n=="1"){var q =("a candlestick ")}
else if(n=="2"){var q =("a raw potato ")}
else if(n=="3"){var q=("a book ")}
else if(n=="4"){var q=("a glass bottle ")}
else if(n=="5"){var q =("water ")}
else if(n=="6"){var q =("fish soup ")}
var o=Math.floor(Math.random() * 4);
if(o=="0"){var v =("in the dark")}
if (o=="1"){var v =("in the light")}
if(o=="2"){var v=("in the middle of nowhere")}
if(o=="3"){var v=("in a giant lemon")}
document.write(a+p+q+v)
document.open()