填词游戏(Mad Libs)看起来像是一个微不足道的编程练习:用用户输入的内容替换模板中的占位词。五分钟就能搞定,对吧?但当你试图把它真正做好时,就会发现自然语言充满了各种边界情况,这些情况会把一个玩具项目变成一项真正的文本处理挑战。
基础引擎
最简单的填词游戏实现使用带有占位符的模板字符串:
function 填词游戏(模板, 词语) {
return 模板.replace(/\{(\w+)\}/g, (匹配项, 键) => {
return 词语[键] || 匹配项;
});
}
const 模板 = "那只{形容词}{名词}{动词}跃过了那道{形容词2}{名词2}。";
const 词语 = {
形容词: "紫色的",
名词: "大象",
动词: "跳",
形容词2: "懒洋洋的",
名词2: "篱笆"
};
填词游戏(模板, 词语);
// "那只紫色的大象跳跃过了那道懒洋洋的篱笆。"
这种方法虽然可行,但存在一些问题。每个占位符都需要唯一的键名,这意味着模板作者必须想出诸如形容词2和形容词3这样的名称。它无法确保词性正确,也无法正确处理冠词(“a”或“an”)。
“a”与“an”的问题
英语中,“a”用于辅音音素开头的单词前,而“an”用于元音音素开头的单词前。当用户提供一个随机的形容词或名词时,冠词可能会用错。
"我看见了一只 elephant" → 错误
"我看见了一只 an elephant" → 正确
"我看见了一只 a unique elephant" → 正确(u 发音为“yoo”)
"一小时后我看见了" → 正确(h 不发音)
仅检查单词首字母的简单方法会失败,因为英语的发音并不总与拼写一致。更稳健的判断方式如下:
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。