|
|
|
| Здравствуйте
пишу скрипт на жс для генерации ключевиков из текста
вот что есть
function keywords(str) {
str = str.replace(/<\/?[^>]+>/gi, ''); //удаление нтмл тегов
str = str.toLowerCase(); //уменьшение
str = str.replace(/&[\w]+;/gi, ' '); //замена символов типа на пробел
str = str.replace(/[^-0-9a-zА-я]/g,' ');//замена других символов на пробел
str = str.replace(/[ ]+/g,' '); //удаление лишних пробелов
str = trim(str,' '); //обрезание пробелов по краям
var array = str.split(' '); //создание массива с ключевиками
var keywords = {};
for (var i=0;i<array.length;i++) { //создание асоциативного массива где ключ это слово а значение это сколько раз слово встерчается
if(keywords[array[i]] == undefined) keywords[array[i]] = 1;
else keywords[array[i]] ++;
}
str = '';
for (var key in keywords) {
str+= ', '+key;
if (str.lenght>225) break;
}
str = str.substr(2);
return str;
}
|
осталось отсортировать объект keywords чтобы вначале массива были ключи с самыми большими значениями (самые встречаемые слова)
в результате после прогона по массиву for (var key in keywords) получится список из самых встречаемых слов
сейчас же список просто из первых встречаемых слов
в общем нужно что-то наподобии функции пхп arsort ($array);
короче вопрос - как на жс отсортировать ассоциативный массив по значениям и потом отсечь только 20 первых значений
спасибо | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(13.09.2010 в 10:29)
| | Сейчас у Вас реально работает правильно только вторая строка в функции (кою Вы назвали "уменьшением").
Всё остальное даст неверный результат.
А кое-что (типа несуществующего в JS метода trim) даст банальную ошибку исполнения.
-----
Но, даже если ВСЁ поправить, Вы получите в 99% случаев набор служебных слов, кои поисковиками отбрасываются (типа "и", "или", "он", "она" и т.д.) и никак не могут быть "ключевыми". | |
|
|
|
|
|
|
|
для: АЯ
(13.09.2010 в 11:42)
| | спасибо за критику.
а по сути вопроса можно что-то ответить?
трим - это функция
function trim ( str, charlist ) {
charlist = !charlist ? ' \s\xA0' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');
return str.replace(re, '');
}
|
насчет коротких слов которые не могут быть ключевыми то данная обработка в примере опущена
приведенный выше код работает, несмотря на вашу критику
повторю свой вопрос
как с помощью жс отсортировать ассоциативный массив
буду благодарен за ответ по сути | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(13.09.2010 в 13:07)
| | По сути.
"Сортировка ассоциативного массива" - понятие странное. Зубодробительное :-)
Подумайте немного САМИ и поймёте всю "прелесть" Вашего желания :-).
В общем, в простейшем виде сделать можно ТАК
Положим, в результате преобразования HTML-кода Вы получили строку str = "СЛОВО1 СЛОВО2 СЛОВО3 ... СЛОВО12345" (БЕЗ конечного и начального пробелов).
Дальнейшие действия таковы:
str = ' ' + str + ' '; //добавляем начальный и конечный пробелы
var rez = [], k = 0;
while (str.length > 1) //крутим, покуда строка не уменьшится до единичного пробела
{
var s0 = str.length; //запоминаем количество символов в строке
var re = new RegExp ('\\S+'); //создаём шаблон первого слова
var r = str.match (re); //находим первое слово по шаблону
var S = r [0]; //запоминаем первое слово
var reL = S.length + 1; //запоминаем длину "первого слова + пробел впереди"
var re = new RegExp (' ' + S + '(?= )', 'g'); //создаём шаблон "первого слова + пробел впереди" для удаления
str = str.replace (re, ''); //удаляем все копии "первого слова + пробел впереди"
var num = (s0 - str.length) / reL; //определяем количество копий первого слова в строке
rez [k] = [];
rez [k].frq = num;
rez [k++].wrd = S; //запоминаем первое слово и частоту его употребления в массиве
}
rez.sort (new Function ('x', 'y', 'return y.frq - x.frq')); //сортируем массив по убыванию частоты
alert ('Первое по частоте "' + rez [0].wrd + '"; встречается ' + rez [0].frq + ' раз');
alert ('Последнее по частоте "' + rez [rez.length - 1].wrd + '"; встречается ' + rez [rez.length - 1].frq + ' раз');
|
| |
|
|
|
|
|
|
|
для: АЯ
(13.09.2010 в 14:27)
| | спасибо
вопрос решен | |
|
|
|