3

ページ上のすべての単語を識別し、そのページにある各単語の各インスタンスの数をカウントする方法を探しています。ただし、これには JavaScript を使用する必要があり、jQuery は使用しません。

アップデート

これは私がこれまでに持っているものです。機能しているように見えますが、2 つ以上の単語が結合されているケースがまだいくつかありますが、手がかりはありますか?

if(window.attachEvent) {
    window.attachEvent("onload", myFunc);
} else {
    if(window.onload) {
        var curronload = window.onload;
        var newonload = function() {
            curronload();
            myFunc();
        };
        window.onload = newonload;
    } else {
        window.onload = myFunc;
    }
}

function myFunc() {
    var words = document.body.innerText;  
    words = words.replace(/\n/g, " "); //Remove line breaks
    words = words.split(" ");
    var foundWords = new Array(); 
    var counts = new Array(); 
    words.forEach(function(s) { 
        s = s.replace(/^\s+|\s+$/g,''); //Trim
        s = s.toLowerCase(); //To lower case
        var index = foundWords.indexOf(s);
        if(s != \'\') { //If word not blank
            if(index < 0) {
                foundWords.push(s);
                var newindex = foundWords.indexOf(s);
                counts.push(1);
            } else {
                counts[index] += 1; 
            }
        }

    });

    //Cycle through all found words and log the index, word & count
    foundWords.forEach( function(s) { 
        var index = foundWords.indexOf(s);
        console.log(index+" "+s+" "+counts[index]);
    });
}
4

4 に答える 4

8

最初に基本的な JavaScript を調査するように促す (やや皮肉な) コメンターに同意することを認めなければなりません。でも、これをやってみると面白いと思ったので、最初に思いついたのはこれです。

単語のリストと頻度をコンソールに出力します。

もちろん、結果をフィルタリングして、結果をもう少し良くしたいと思う人もいるでしょうが、それは別の問題です。

http://jsfiddle.net/E7qSb/

var words = [];

var walkDOM = function (node, func) {
    func(node);
    node = node.firstChild;
    while(node) {
        walkDOM(node, func);
        node = node.nextSibling;
    }

};

walkDOM(document.body, function (node) {

    if (node.nodeName === '#text') {
        var text = node.textContent;

        text = text.replace(/[^A-Za-z]/g, ' ');

        text = text.split(' ');

        if (text.length) {

            for (var i = 0, length = text.length; i < length; i += 1) {
                var matched = false,
                    word = text[i];

                for (var j = 0, numberOfWords = words.length; j < numberOfWords; j += 1) {
                    if (words[j][0] === word) {
                        matched = true;
                        words[j][1] += 1;
                    }
                }

                if (!matched) {
                    words.push([word, 1]);
                }

            }
        }
    }
});

var displayWordList = function (words) {
    for (var i = 0, length = words.length; i < length; i += 1) {
        console.log(words[i][0], words[i][1]);
    }
};

displayWordList(words);
​

これは、JavaScript の Douglas Crockford の walkDOM の例: The Good Parts を使用しています。しかし、他の人々からは、document.body の innerText プロパティがあることがわかりますか?! それは、うーん、簡単です。

単語数を維持する方法が質問者にとって役立つ可能性があるため、この回答は残しておきます。

于 2012-12-31T19:32:30.300 に答える
2

このような正規表現を使用します。

var words = document.body.textContent || document.body.innerText,
    matches = words.match(/word/gmi);

console.log(matches);
于 2012-12-31T19:09:42.830 に答える
1

こんな感じで使えます。

var findWord="What";
var totalCount = document.body.innerText.split(findWord).length - 1;
于 2012-12-31T19:14:18.860 に答える
0

このソリューションを磨くことができます:

<!DOCTYPE html>
<html>
<body>

<p id="demo">Click the button to display the matches.</p>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction()
{
    var str="The rain in SPAIN stays mainly in the plain rain"; 
    var n=str.match(/\S+/g);

    document.getElementById("demo").innerHTML=n;

    for(i=0; i < n.length ; i++){
        r = str.match(new RegExp( n[i], 'g' ));
        document.getElementById("demo").innerHTML+= '<br>'+ n[i] +' = ' + r.length ;
    }
}
</script>

</body>
</html>
于 2012-12-31T19:20:47.250 に答える