JavaScript에서 키워드를 계산하는 가장 좋은 방법은 무엇입니까?
-
02-07-2019 - |
문제
JavaScript에서 키워드를 계산하는 가장 좋고 효율적인 방법은 무엇입니까? 기본적으로 문자열을 가져 와서 주로 제안 태그를 사용하기 위해 문자열에서 발생하는 맨 위 N 단어 나 문구를 얻고 싶습니다. 나는 실제 코드보다 개념적 힌트 나 실제 예제에 대한 링크를 더 찾고 있지만 코드를 공유하고 싶다면 확실히 신경 쓰지 않을 것입니다. 도움이 될 특별한 기능이 있다면 감사합니다.
지금은 스플릿 () 함수를 사용하여 문자열을 공간별로 분리 한 다음 정규 표현식으로 구두점을 청소하고 있다고 생각합니다. 나는 또한 그것이 사례에 민감하지 않기를 원합니다.
해결책
자르기, 붙여 넣기 + 실행 데모 :
var text = "Text to be examined to determine which n words are used the most";
// Find 'em!
var wordRegExp = /\w+(?:'\w{1,2})?/g;
var words = {};
var matches;
while ((matches = wordRegExp.exec(text)) != null)
{
var word = matches[0].toLowerCase();
if (typeof words[word] == "undefined")
{
words[word] = 1;
}
else
{
words[word]++;
}
}
// Sort 'em!
var wordList = [];
for (var word in words)
{
if (words.hasOwnProperty(word))
{
wordList.push([word, words[word]]);
}
}
wordList.sort(function(a, b) { return b[1] - a[1]; });
// Come back any time, straaanger!
var n = 10;
var message = ["The top " + n + " words are:"];
for (var i = 0; i < n; i++)
{
message.push(wordList[i][0] + " - " + wordList[i][1] + " occurance" +
(wordList[i][1] == 1 ? "" : "s"));
}
alert(message.join("\n"));
재사용 가능한 기능 :
function getTopNWords(text, n)
{
var wordRegExp = /\w+(?:'\w{1,2})?/g;
var words = {};
var matches;
while ((matches = wordRegExp.exec(text)) != null)
{
var word = matches[0].toLowerCase();
if (typeof words[word] == "undefined")
{
words[word] = 1;
}
else
{
words[word]++;
}
}
var wordList = [];
for (var word in words)
{
if (words.hasOwnProperty(word))
{
wordList.push([word, words[word]]);
}
}
wordList.sort(function(a, b) { return b[1] - a[1]; });
var topWords = [];
for (var i = 0; i < n; i++)
{
topWords.push(wordList[i][0]);
}
return topWords;
}
다른 팁
그 단어 배열이 정리되면 전화를 걸고 있다고 말하면 wordArray
:
var keywordRegistry = {};
for(var i = 0; i < wordArray.length; i++) {
if(keywordRegistry.hasOwnProperty(wordArray[i]) == false) {
keywordRegistry[wordArray[i]] = 0;
}
keywordRegistry[wordArray[i]] = keywordRegistry[wordArray[i]] + 1;
}
// now keywordRegistry will have, as properties, all of the
// words in your word array with their respective counts
// this will alert (choose something better than alert) all words and their counts
for(var keyword in keywordRegistry) {
alert("The keyword '" + keyword + "' occurred " + keywordRegistry[keyword] + " times");
}
그것은 당신에게 작업 의이 부분을 수행하는 기본 사항을 제공해야합니다.
문자열을 단어로 나누고 결과 단어를 세고 카운트를 정렬하십시오.
이것은 이전 답변을 바탕으로합니다 인신 하나의 루프만으로 :
function top_words(text, n) {
// Split text on non word characters
var words = text.toLowerCase().split(/\W+/)
var positions = new Array()
var word_counts = new Array()
for (var i=0; i<words.length; i++) {
var word = words[i]
if (!word) {
continue
}
if (typeof positions[word] == 'undefined') {
positions[word] = word_counts.length
word_counts.push([word, 1])
} else {
word_counts[positions[word]][1]++
}
}
// Put most frequent words at the beginning.
word_counts.sort(function (a, b) {return b[1] - a[1]})
// Return the first n items
return word_counts.slice(0, n)
}
// Let's see if it works.
var text = "Words in here are repeated. Are repeated, repeated!"
alert(top_words(text, 3))
예제의 결과는 다음과 같습니다. [['repeated',3], ['are',2], ['words', 1]]
나는 각 단어를 격리하기 위해 위에서 언급 한 것을 정확히 할 것입니다. 그런 다음 아마도 각 단어를 값으로 발생하는 배열의 색인으로 추가 할 것입니다.
예를 들어:
var a = new Array;
a[word] = a[word]?a[word]+1:1;
이제 당신은 얼마나 많은 독특한 단어가 있는지 (a.length)와 각 단어의 발생이 몇 개 존재하는지 알 수 있습니다 ([단어]).
제휴하지 않습니다 StackOverflow