如何搜索与其他单词相似的单词?
Posted
技术标签:
【中文标题】如何搜索与其他单词相似的单词?【英文标题】:How do I search for words similar to other words? 【发布时间】:2018-10-24 15:20:15 【问题描述】:
我希望在 Node.js 中制作一个小脚本,它将单词与另一个相似的单词进行匹配。例如,我正在搜索***ing
,并且我有一个类似['loving', 'mating', 'cats', 'wording']
的数组,那么我希望它返回['loving', 'mating']
并排除['cats']
(因为它不以ing 结尾),和['wording']
(因为它是七个字符而不是六个。)。
这是我当前编写的不工作代码。
let foundWords = [];
for (let i = 0, len = wordList.length; i < len; i++)
for (let j = 0, len = wordList[i].split('').length; j < len; j++)
if (wordToFind.charAt(j) == '*')
return;
;
if (wordToFind.charAt(j) === wordList[i].charAt(j))
if (foundWords.includes(wordList[i]) == false)
foundWords.push(wordList[i]);
;
console.log(foundWords);
编写此代码的目的是让我可以使用字典来暴力破解此密码的所有组合以及其中的单词。
【问题讨论】:
【参考方案1】:另一种方法可能是这样的;
function getMatches(ts, ss)
var es = ts.split(/\*+/)[1]; // or ts.match(/[^\*]+$/)[0];
return ss.filter(s => s.endsWith(es) && s.length === ts.length)
var res = getMatches("***ing",['loving', 'mating', 'cats', 'wording']);
console.log(res);
【讨论】:
【参考方案2】:嘿,我认为这应该可行。如果您不了解某个部分,请尝试在MDN 查找String.prototype
函数。了解其中的一些函数真的很有帮助,因为它会让你的代码更容易。
let input = '***ing';
let inputLength = input.length
let results = [];
while (input.charAt(0) === "*")
input = input.substr(1);
const arr = ['loving', 'mating', 'cats', 'wording'];
for (let i = 0; i < arr.length; i++)
if (inputLength != arr[i].length)
continue;
if(arr[i].indexOf(input) != -1)
results.push(arr[i]);
console.log(results);
【讨论】:
顺便说一句,虽然这个作品使用 4castle 解决方案,但更优雅。【参考方案3】:我真的建议您阅读 Levenshtein 距离 听起来和你在这里想要实现的完全一样
https://en.wikipedia.org/wiki/Levenshtein_distance#Example
java脚本中的一个实现 https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#javascript
在信息论和计算机科学中,Levenshtein 距离 是衡量两个之间差异量的指标 序列(即编辑距离)。之间的 Levenshtein 距离 两个字符串被定义为需要的最小编辑次数 使用允许的编辑将一个字符串转换为另一个字符串 操作是插入、删除或替换单个 字符。
示例“kitten”和“sitting”之间的 Levenshtein 距离为 3, 因为以下三个编辑将一个更改为另一个,并且 不是少于三个编辑的方法:
kitten sitten(用“s”代替“k”)
sitten sittin(用“i”代替“e”)
坐着(在末尾插入“g”)。
【讨论】:
【参考方案4】:您可以将Array.prototype.filter
与RegExp
一起使用。
要构造正则表达式,您需要将通配符 *
替换为正则表达式的通配符:.
。然后添加^
和$
来锚定正则表达式以匹配从字符串的开头到结尾。
function filterMatches(needle, haystack)
const regex = new RegExp('^' + needle.replace(/\*/g, '.') + '$');
return haystack.filter(word => regex.test(word));
console.log(filterMatches('***ing', ['loving', 'mating', 'cats', 'wording']));
【讨论】:
以上是关于如何搜索与其他单词相似的单词?的主要内容,如果未能解决你的问题,请参考以下文章
如何在整个消息中搜索一个单词,将该单词分解为一个数组,然后检查其他数组以查看它是不是匹配?
是否有任何用于搜索特定单词的 python 库,如 "the"、"is"、"was"、"am" .... 和其他类似单词