Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: генерация ключевых слов
 
 автор: Дмитрий Смаль   (13.09.2010 в 10:29)   письмо автору
 
 

Здравствуйте
пишу скрипт на жс для генерации ключевиков из текста
вот что есть
function keywords(str) {
    str = str.replace(/<\/?[^>]+>/gi, '');  //удаление нтмл тегов
    str = str.toLowerCase();                //уменьшение
    str = str.replace(/&[\w]+;/gi, ' ');    //замена символов типа &nbsp; на пробел
    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 в 11:42)   письмо автору
 
   для: Дмитрий Смаль   (13.09.2010 в 10:29)
 

Сейчас у Вас реально работает правильно только вторая строка в функции (кою Вы назвали "уменьшением").
Всё остальное даст неверный результат.
А кое-что (типа несуществующего в JS метода trim) даст банальную ошибку исполнения.
-----

Но, даже если ВСЁ поправить, Вы получите в 99% случаев набор служебных слов, кои поисковиками отбрасываются (типа "и", "или", "он", "она" и т.д.) и никак не могут быть "ключевыми".

  Ответить  
 
 автор: Дмитрий Смаль   (13.09.2010 в 13:07)   письмо автору
 
   для: АЯ   (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 в 14:27)   письмо автору
 
   для: Дмитрий Смаль   (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 + ' раз');

  Ответить  
 
 автор: Дмитрий Смаль   (14.09.2010 в 11:57)   письмо автору
 
   для: АЯ   (13.09.2010 в 14:27)
 

спасибо
вопрос решен

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования