在javascript中,对照英语词典检查字符串变量中的项

in javascript checking items in a string variable against an English dictionary

本文关键字:字符串 检查 变量 英语 javascript      更新时间:2023-09-26

我有下面的函数,它从所有英文字母的数组中随机选择字母(加上空格,加上<br/>),并将它们存储在字符串变量中。

该函数有一个循环,可生成2500个随机字符。我想检查两个空格(即"或一个空格和一个回车("或<br/>)或两个<br/>之间的字母序列中的哪一个构成合法的英语单词。

我该怎么做?特别是

  1. 我需要下载一本英语词典吗
  2. 如何将我所有的字符串与它进行比较
  3. 保留合法的词语?这是功能

JS

function statement() {
    var letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "<br/>"];
    for (var i = 0; i <= 2500; i++) {
        var random_letter = Math.floor(Math.random() * letters.length);
        result += letters[random_letter];
    }
    document.getElementById("random1").innerHTML += result;
}

首先:您需要一个单词列表。如果你使用Unix操作系统,你很可能在/usr/share/dict/words中有一个中等大小的单词列表,但你会在网上找到很多,一个简短的搜索给出http://www-01.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt大约有10万字。这些已经排序了,所以你可以把它们一个字一个字地放在Array中。因为它是排序的,所以你可以用快速的二进制搜索来搜索它。

你在空格和换行符之间寻找单词,但如果例如word<br/>word2 word3<br/>算作word, word2, word3word, word2 word3,这有点模糊,所以word2 word3会是一种句子吗?我假设第一种变体:为了简单起见,从现在起,只有一个单词,没有句子。

在生成字符串的循环中,如果每个生成的字符都是空格/换行符,我会检查到目前为止生成的字符串,并根据字典进行检查。

如果你坚持只处理最终生成的字符串,你必须将其拆分为单个单词,也许可以使用regex,因为这里很简单:

var s = ("word1   word2<br/>  <br/><br/> word3   <br/>").replace(/<br[/]>/g,"").split(/['s]+/);
s.join(",");
//word1,word2,word3,
//              the ^ last one is empty

然后循环遍历数组,并对照字典检查您找到的每个单词。因为我糟糕的拆分版本中的最后一个条目是空的,其他条目也可能是空的(如果你玩它的话),你需要检查每个条目中是否有东西。

您可以通过(ab)使用{key:value}对象,将麻烦留给JavaScript引擎,而不是使用简单的数组和二进制搜索来进行字典搜索。(这个例子是从已经排序的单词列表中排序的,因为C&P,它不需要排序)

dict = {Banach:0,Bancroft:0,Bandung:0,"Banga lore":0,Bangkok:0,Bangladesh:0,
    Bangladeshi:0,Bangor:0,Bangui:0,Banjarmasin:0,Banjul:0,Banks:0,
    Banneker:0,Deleon:0,Delgado:0,Delhi:0,Delia:0,Delibes:0,Delicious:0,
    Delilah:0,Delius:0,Dell:0,Dell:0,Della:0,Delmar:0,Delmarva:0,Delmer:0,
    Delmonico:0,Delores:0,Deloris:0,Hanukkahs:0,Hapsburg:0,Harare:0,
    Harbin:0,Hardin:0,Harding:0,Hardy:0,Hargreaves:0,Harlan:0,Harlem:0,
    Harlequin:0,Harley:0,Harlow:0,Harmon:0};
dict.hasOwnProperty("Delores");    // true
dict.hasOwnProperty("foo");        // false

您在此处使用键作为值。实际值在这种情况下被浪费了,但你可以使用它们进行进一步的细化,例如:标记名词、动词、形容词等。你不局限于数字,当然,你可以使用所有东西,甚至是该词的完整字典条目(甚至有图片和音乐,但那是另一回事)。

这是使用节点js实现的工作代码

1) 是的,你必须下载单词,我使用请求模块从url中获取它们。

基本上,您必须将该网站的单词列表用regalr表达式拆分为一个数组,还必须用另一个正则表达式拆分随机生成的字符串。然后,你做一个for循环,一次一个地遍历它们中的每一个,将每个真实单词与每个生成的单词进行比较。像这样:

var request = require("request");

request("http://www.math.sjsu.edu/~foster/dictionary.txt", function(err,status, resp){
        var letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "<br/>"];
        letters = letters.map(function(letter){ return letter.toLowerCase()});
        //console.log(wordsArr);
        var result = "";
        var c = 0;
        for (var i = 0; i <= 10000; i++) {
            var random_letter = Math.floor(Math.random() * letters.length);
            result += letters[random_letter];
            c++;
        }
        if(c >= 2500){
            var randomResultArr = result.split(/<br'/>|<br'/><br'/>|'s/);
            console.log(randomResultArr);
            var matchesArr = getWordMatches(wordsArr = resp.split("'n"), result.split(/<br'/>|<br'/><br'/>|'s/));
            console.log("MATCHES: " + matchesArr);
        }
});

    function getWordMatches(wordsArr, resultArr){
    var matchesArr = [];
    console.log("WORDSARR ", wordsArr.length);
    console.log("RES ARR ", resultArr.length);

    for(var i = 0; i < wordsArr.length; i++ ){
        for(var x = 0; x < resultArr.length; x++){
            if( (wordsArr[i] === resultArr[x]) && wordsArr[i] !== "" ){
                matchesArr.push(wordsArr[i]);
                console.log("WORD MATCH : " + wordsArr[i]);
            }
        }
    }
    return matchesArr;

} 

这是它的一个样本输出,我不得不将2500增加到10000才能获得更多的匹配:

WORDSARR  349901
RES ARR  747
WORD MATCH : giros
WORD MATCH : goad
WORD MATCH : kaqa
WORD MATCH : lome
WORD MATCH : mibs
MATCHES: giros,goad,kaqa,lome,mibs