- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
上下文:随机句子生成器
the function
generateSentence()
generates random sentencesreturned as strings (works fine)the function
calculateStats()
outputs the number of uniquestrings the above function can theoretically generate (works fine also inthis mockup, so be sure to read the disclaimer, I don't want to waste your time)the function
generateStructure()
and the words lists inDictionnary.lists
are constantly growing as time passes
主生成器功能的快速模型:
function generateSentence() {
var words = [];
var structure = generateStructure();
structure.forEach(function(element) {
words.push(Dictionnary.getElement(element));
});
var fullText = words.join(" ");
fullText = fullText.substring(0, 1).toUpperCase() + fullText.substring(1);
fullText += ".";
return fullText;
}
var Dictionnary = {
getElement: function(listCode) {
return randomPick(Dictionnary.lists[listCode]);
},
lists: {
_location: ["here,", "at my cousin's,", "in Antarctica,"],
_subject: ["some guy", "the teacher", "Godzilla"],
_vTransitive: ["is eating", "is scolding", "is seeing"],
_vIntransitive: ["is working", "is sitting", "is yawning"],
_adverb: ["slowly", "very carefully", "with a passion"],
_object: ["this chair", "an egg", "the statue of Liberty"],
}
}
// returns an array of strings symbolizing types of sentence elements
// example : ["_location", "_subject", "_vIntransitive"]
function generateStructure() {
var str = [];
if (dice(6) > 5) {// the structure can begin with a location or not
str.push("_location");
}
str.push("_subject");// the subject is mandatory
// verb can be of either types
var verbType = randomPick(["_vTransitive", "_vIntransitive"]);
str.push(verbType);
if (dice(6) > 5) {// adverb is optional
str.push("_adverb");
}
// the structure needs an object if the verb is transitive
if (verbType == "_vTransitive") {
str.push("_object");
}
return str;
}
// off-topic warning! don't mind the implementation here,
// just know it's a random pick in the array
function randomPick(sourceArray) {
return sourceArray[dice(sourceArray.length) - 1];
}
// Same as above, not the point, just know it's a die roll (random integer from 1 to max)
function dice(max) {
if (max < 1) { return 0; }
return Math.round((Math.random() * max) + .5);
}
在某些时候,我想知道它可以输出多少个不同的唯一字符串,我写了类似的内容(再次非常简化):
function calculateStats() {// the "broken leg" function I'm trying to improve/replace
var total = 0;
// lines below : +1 to account for 'no location' or 'no adverb'
var nbOfLocations = Dictionnary.lists._location.length + 1;
var nbOfAdverbs = Dictionnary.lists._adverb.length + 1;
var nbOfTransitiveSentences =
nbOfLocations *
Dictionnary.lists._vTransitive.length *
nbOfAdverbs *
Dictionnary.lists._object.length;
var nbOfIntransitiveSentences =
nbOfLocations *
Dictionnary.lists._vIntransitive.length *
nbOfAdverbs;
total = nbOfTransitiveSentences + nbOfIntransitiveSentences;
return total;
}
(旁注:不要担心命名空间污染、输入参数的类型检查或此类事情,为了示例清晰起见,假设这是在气泡中。)
重要免责声明:这不是为了修复我发布的代码。这是一个模型,它可以按原样工作。真正的问题是“随着 future 可能结构的复杂性的增长,以及列表的大小和多样性,计算这些类型的随机结构的统计数据的更好策略是什么,而不是我笨拙的策略calculateStats()
函数,该函数难以维护,可能处理天文数字*,并且容易出错?”
* 在真实的工具中,目前有 351 120 个独特的结构,对于句子来说......总数已经超过(10 的 80 次方)一段时间了。
最佳答案
由于您的句子结构发生了很大变化(在这个小示例中确实发生了变化,我无法想象它在实际代码中发生了多大变化),我会做类似的事情:
首先,我需要以某种方式保存给定字典中存在的所有可能的句子结构...也许我会创建一个具有以下属性的 Language
对象:字典作为一个属性,我可以添加可能的句子结构(这部分可能可以优化并找到一种更程序化的方式来生成所有可能的句子结构,例如规则引擎)。 句子结构是什么意思?好吧,按照你的例子,我将把句子结构称为下一个:
[ 'location', 'transitive-verb', 'adverb', 'object' ] < - Transitive sentence
[ 'location', 'instransitive-verb', 'adverb' ] <- Intransitive sentence
您可能会找到一种生成此结构的方法...或对它们进行硬编码。
但是...为什么我认为这可以改进您计算统计数据的方式?因为您可以通过使用映射/归约操作来最小化每个句子数量的硬编码并使其更具可扩展性.
那么...如何?
想象一下,我们可以在全局范围内或通过对象或字典本身访问我们的结构:
// Somewhere in the code
const structures = [
[ 'location', 'transitive-verb', 'adverb', 'object' ],
[ 'location', 'instransitive-verb', 'adverb' ]
];
...
// In this example I just passed it as an argument
function calculateStats(structures) {
const numberOfCombinations = structures.reduce((total, structure) => {
// We should calculate the number of combinations a structure has
const numberOfSentences = structure.reduce((acc, wordType) => {
// For each word type, we access the list and get the lenght (I am not doing safety checks for any wordType)
return acc + Dictionary.lists[wordType].length
}, 0);//Initial accumulator
return total + numberOfSentences;
}, 0); // Initial accumulator
return numberOfCombinations;
}
因此,我们将利用迭代不同结构的能力,而不是对每种可能的组合进行硬编码,因此您基本上只需要添加结构,并且 calculateStats
函数不会增长。
如果您需要进行更复杂的计算,则需要更改 reducer 中使用的函数。
我对语法或句法分析的了解非常少,因此,拥有更多知识的您可能可以找到使其变得更简单或进行“更智能计算”的方法。
我自由地以 ES6 风格编写它,如果 reduce 对你来说是一种奇怪的动物,you can read more here或使用lodash/ramda/随便^^
关于javascript - 有什么更好的方法来设计句子生成器的内置统计函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51466489/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!