- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道如何在 PHP 中生成一个随机的逻辑单词列表。
我有一个充满英文单词 (A - Z) 的 MySQL 数据库,我想生成符合每个单词的逻辑单词。
例如:在我的单词列表中,数字 26 是“abandon”,我想为这个单词生成一个单词,可能使用正则表达式或其他东西,这样我就可以使用它来回翻译整页单词。
直接使用随机词的问题在于它们看起来不够真实,因此“abandon”可能会变成(纯粹随机生成的)“qdbskp”或类似的东西。问题是这个词看起来一点也不真实,看起来就像有人用脸猛击键盘。
但是我想要一些逻辑,所以也许有一些元音和辅音使这个词看起来“真实”。
希望我的解释是正确的。
谢谢。
TLDR:我正在尝试创建一个随机生成的单词词典,其中包含指向具有某种逻辑的英语单词列表的链接,因此这些单词看起来很真实。
最佳答案
让一个词看起来有点合乎逻辑的是,如果它是按照您习惯看到的顺序由字符组成的。一种方法是使用 trigrams 的加权列表- 3 个字符的序列。
基本上,您可以使用任意两个字母,例如“so”,然后添加另一个通常跟在它后面的字母,例如“l”。然后取最后两个字母“ol”,然后找出后面的内容。冲洗/重复,直到你得到一个你想要的任何长度的单词 - “solverom”。
采购自 Peter Norvig's n-gram data (它本身是从 Google books ngrams 编译的),我在 github 上整理了一些 json 文件。 .我会直接在此处包含数据,但特别是 trigrams.json 有点大,约为 128KB。
数据实际上可以从任何字典或其他庞大的单词列表中编译,并且结构如下...
[0,26,622,4615,6977,10541,13341,14392,13284,11079,8468,5769,3700,2272,1202,668,283,158,64,40,16,1,5,2]
这个已经完成了。它是不同单词长度的(0 索引)分布。每个索引是单词长度,每个值是找到了多少个该长度的单词。因此,例如,有 4615 个不同的单词,长度为 3 个字符。
我们将使用它来决定我们的新单词应该有多长。基本上我们将所有值相加,在 1 和总数之间选择一个随机数,然后找到它在集合中的位置。该元素的关键是单词的长度。
{
"TH": "82191954206",
"HE": "9112438473",
"IN": "27799770674",
"ER": "324230831",
...
这个结合了双字母组合、两个字符的组合,以及它们出现在单词开头的频率。是的,一切都是大写字母。
我们将使用它来决定以什么开头。
{
"TH": {
"E": "69221160871",
"A": "9447439870",
"I": "6357454845",
"O": "3369505315",
"R": "1673179164",
...
},
"AN": {
"D": "26468697834",
"T": "3755591976",
"C": "3061152975",
...
这个比较有趣。此数据集中的每个键都是一个二元组,其中包含一个字符数组以及该字符在其后出现的频率。
“D”经常出现在“AN”之后。
这就是我们将用来构建单词其余部分的内容。
首先我们需要一些实用函数。
function gmp_rand($min, $max) {
$max -= $min;
$bit_length = strlen(gmp_strval($max, 2));
do {
$rand = gmp_init(0);
for ($i = $bit_length - 1; $i >= 0; $i--) {
gmp_setbit($rand, $i, rand(0, 1));
if ($rand > $max) break;
}
} while ($rand > $max);
return $rand + $min;
}
因为我们需要生成的一些数字可能大于PHP_INT_MAX
我们将使用 PHP GMP extension对付他们。足够简单 rand()
像工作一样。
function array_weighted_rand ($list) {
$total_weight = gmp_init(0);
foreach ($list as $weight) {
$total_weight += $weight;
}
$rand = gmp_rand(1, $total_weight);
foreach ($list as $key => $weight) {
$rand -= $weight;
if ($rand <= 0) return $key;
}
}
这很像内置的 array_rand()
因为你传递给它一个数组,它会返回一个随 secret 钥。采摘时只有这一项会影响重量。
因此,如果您传入一个如下所示的数组:
array (
'foo' => 2,
'bar' => 4,
'baz' => 12
)
它返回 bar
的频率大约是 foo
的两倍,baz
大约是 的三倍>条形图
。
function fill_word ($word, $length, $trigrams) {
while (strlen($word) < $length) {
$word .= array_weighted_rand($trigrams[substr($word, -2)]);
}
return $word;
}
这需要一个字符串 $word
并将其从给定的 $trigrams
集合中填充到 $length
。它根据字符串中的最后两个字符从数据集中挑选的每次迭代。
$lengths = json_decode(file_get_contents('distinct_word_lengths.json'), true);
$bigrams = json_decode(file_get_contents('word_start_bigrams.json'), true);
$trigrams = json_decode(file_get_contents('trigrams.json'), true);
for ($i = 0; $i < 10; $i++) {
do {
$length = array_weighted_rand($lengths);
$start = array_weighted_rand($bigrams);
$word = fill_word($start, $length, $trigrams);
} while (!preg_match('/[AEIOUY]/', $word));
$word = strtolower($word);
echo "$word\n";
}
我们正在做的是获取随机长度和随机二元组作为单词的开头,然后将其填充。 preg_match()
只是为了验证单词是否包含元音,否则无法保证。如果没有,请重试。
您可以将其替换为您可能想要执行的任何类型的验证,例如确保它不匹配您数据库中的真实单词或其他内容。
是的,您可能会生成一个真实的单词。如果您想说这是您编造的,只需发音不同即可。
运行几次后我得到了这些:
ancover ingennized plesuri asymbablew
orkno oftedi nestrat arlysect
welvency thembe therespaid frokedgerition
judeth ist rectede privede
aprommautu offeleal townerislo callynerly
thentsi perma themenum agesputherflone
pecticangenti whoult ifileyea onster
flatco powne prative betion
inegansith meraddin theste mysistai
skerest uppre ongdonc hadmints
我的拼写检查器讨厌所有这些。
完整的数据和代码可以从github获取.
关于php - 我怎样才能生成一个随机的逻辑词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966526/
我有以下案例要解决。 在短语中突出显示关键字的 Javascript 方法。 vm.highlightKeywords = (phrase, keywords) => { keywords =
我要匹配文本中的所有美元符号单词。例如,"Hello $VARONE this is $VARTWO"可以匹配$VARONE和$VARTWO。 正则表达式应该是/\$(\w+)/g,但是当我在Dart
在 redux 中,对于将状态作为参数、更改状态并返回新状态的特定操作,您会在 switch 语句中调用什么函数? function reducer(state = DEFAULT_STATE, ac
在 MySQL 5.1 中,我将一个字段命名为“Starting”。但是,每次我使用 SQL 查询时,它都会说无效的 SQL 语法。经过一些谷歌搜索,我发现 STARTING 是一个保留的 SQL 词
我必须使用函数 isIn(secretWord,lettersGuessed) 从列表中找到密码。在下面发布我的代码。 def isWordGuessed(secretWord, lettersGue
一段时间以来,我一直无法找到两个字符串中最长的常用词。首先我想到了用“isspace”函数来做这件事,但不知道如何找到一个常用词。然后我想到了“strcmp”,但到目前为止我只能比较两个字符串。我在想
我目前正在尝试制作一种“单词混合器”:对于两个给定的单词和指定的所需长度,程序应返回这两个单词的“混合”。然而,它可以是任何类型的混合:它可以是第一个单词的前半部分与第二个单词的后半部分相结合,它可以
如果 After 之后(逗号之前)没有 -ing 词,我想匹配它。所以 After 和逗号之间不应该有 -ing 词。 所需的匹配项(粗体): After sitting down, he began
我一直在试验 Stanford NLP 工具包及其词形还原功能。我很惊讶它如何使一些词词形还原。例如: depressing -> depressing depressed -> depressed
js 并尝试根据 [这里] 中的示例代码来做词云:https://github.com/jasondavies/d3-cloud .我想做的是单词的字体大小是基于数组中单词的频率。例如我有 [a,a,
我正在处理一个文本分类问题(在法语语料库上),并且正在试验不同的词嵌入。我对 ConceptNet 提供的内容非常感兴趣,所以我决定试一试。 我无法为我的特定任务找到专门的教程,所以我听取了他们的建议
当我在文本中搜索时,我输入 C-s,然后输入单词,然后一次又一次地输入 C-s,光标前进到找到的单词的下一个位置。问题是,一旦我转到下一个单词,我无法在按钮处编辑迷你缓冲区中的搜索单词,如果我按 Ba
我正在尝试按照以下结构运行这个 maven Hello Word: ├── pom.xml └── src └── Main.java 使用pom.xml设置: 4.0.0
所以,从我可以开始的.. 我正在使用 OCR。该脚本非常适合我的需要。它检测单词的准确性对我来说还可以。 这是结果:附加图像 100% 准确。 from PIL import Image import
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
这是细节,但我想知道为什么会这样。 示例代码: Class klasa = Enum.class; for(Type t : klasa.getGenericInterfaces()) Syst
我在用: var header = ""+ "Export HTML to Word Document with JavaScript"; var footer = ""; /
我有一个程序可以像这样将数据打印到控制台(以空格分隔): variable1 value1 variable2 value2 variable3 value3 varialbe4 value4 编辑:
我有一个程序可以像这样将数据打印到控制台(以空格分隔): variable1 value1 variable2 value2 variable3 value3 varialbe4 value4 编辑:
最近我在查看与goliath相关的一些代码时,偶然在Ruby代码中看到了这个词use。 , 中间件等。看起来它不同于include/extend, and require. 有人可以解释为什么存在这个
我是一名优秀的程序员,十分优秀!