Javascript.RU

Cтатистика текста в textarea

Задача подсчета статистики текста в поле textare не нова и не раз решена до меня, но вот понадобилось локальное решение без взаимодействия с многочисленными интернет-сервисами подобного рода... Результат представляю на суд почтеннейшей публики.

Для полного плезира не хватает реализации стеммера Портера. Ну это уже как-нибудь при случае. В первом приближении, на мой взгляд, статистики вполне достаточно для грубой оценки текста при подготовке статей под копирайтинг.

В целях экономии, функциональные возможности скрипта описаны прямо в листинге, благо textarea там присутствует.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"  lang="ru">
<head>
<META http-equiv="Content-Type" content="text/html; charset=windows-1251">

<style type="text/css">
.alert       { z-index: 1; position: absolute; text-align: center; }
.alert table { border-collaps: collapsed; border: 1px #000 solid; background-color: #ddd; }
.alert td    { font: normal 8pt Courier New; padding: 5px; vertical-align: top; text-align: left; white-space: nowrap; border-right: 1px #eee solid; }
.alert .ok   { text-align: center; color:#00f; cursor: pointer; }
</style>

<script language="javascript">

function wordFreq(a) { 
  var k, i=0, tmp={}; 
  for (k in a) { 
    if(isFinite(k)) {
      if(tmp.hasOwnProperty(a[k])) tmp[a[k]]+=1; else { tmp[a[k]]=0; ++i; }
    }
  } 
  tmp['#uw#']=i; return(tmp); 
};

function wordSort(a) {
  var tmp=[], out=[];
  for (var k in a) tmp.push([k,a[k]]);
  tmp.sort(function(a,b) { return(arguments[0][1] > arguments[1][1])});
  i=tmp.length-1; for (i;i>=0;i--) out[tmp[i][0]]=tmp[i][1];
  return(out);
}


function wordStat(obj,wtop) {
  var wmin=3;
  var w=document.createElement('DIV'), text='', txt='', i, j, k, f, t;

  wtop=wtop<10?10:wtop; try { w.innerHTML=obj.value; } catch(e) { return (0); }

  document.forms[0].run.disabled=true;

  text=(w.textContent || w.innerText).replace(/\n|\r/g,' ').replace(/\s\s+/g,' ').toLowerCase(); j=text.length;
  text=text.replace(/[^a-zа-я0-9- ]/g,' ').replace(/\s\s+/g,' ').replace(/\s+$/,''); 

  txt=text.split(' '); f=k=t=txt.length; 

  for(i=0;i<t;i++) { 
    if( txt[i].length<=wmin ) { 
      delete txt[i]; --k;
    } 
  }

  txt=txt.sort(); txt=txt.slice(0,k);

  div='<table><tr><td>'+
      'Total chars: '+j+'<br>'+
      'Texts chars: '+text.replace(/ /g,'').length+'<br><br>'+
      'Total words: '+f+'<br>'+
      'W/out stops: '+k+'<br>'+
      'One unique : %1<br><br>'+
      'Direct spam: '+'%2<br>'+
      'Text water : '+(((f-k)/f)*100).toFixed(1)+'%0'+
      '<div class="ok">[ ok ]</div></td>'+
      '<td>%3</td><td>';

  text=wordFreq(txt); j=text['#uw#']; 
  delete text['#uw#']; text=wordSort(text); 

  f=''; i=0; t=k;
  for (k in text) { 
    if(isFinite(text[k])) {
      if(i==0){ t=(((text[k]+1)/t)*100).toFixed(2); }
      if(i++>=wtop) break; div+=k+'<br>'; f+=(++text[k])+'<br>'; 
    }
  }
  txt=''; for(i=0;i<(wtop-9);i++) txt+='<br>';

  w.innerHTML = div.replace('%0',txt).replace('%1',j).replace('%2',t).replace('%3',f)+'</td></tr></table>'; 
  w.setAttribute('style','top:'+(obj.offsetTop+10)+'px; left:'+(obj.offsetLeft+10)+'px;');
  w.onclick=function(){ document.forms[0].run.disabled=false; this.parentNode.removeChild(this); };
  w.setAttribute('class','alert'); obj.parentNode.appendChild(w);

return(0);
}

</script>

</head>
<body>

<b>JavaScript: statistics of the text in the &lt;textarea&gt;</b>

<form>
<textarea id="text" cols=100 rows=20>
<p>Скрипт подсчета статистики в поле textarea. Выводит статистику текста, 
отбрасывая теги HTML-разметки, по следующим параметрам:</p>

<pre>
1. Total chars: общее количество символов
2. Texts chars: количество символов без учета пробелов и пунктуации
3. Total words: общее количество слов
4. W/out stops: количество слов без стоп-слов
5. One unique : количество уникальных слов без стоп-слов
6. Direct spam: "спамность" [% вхождения самого частого к п.4]
7. Text water : "водность"  [% отброшенных слов (п.3-п.4)/п.3]
8. Отсортированный по частоте ТОП 10 используемых в тексте слов
</pre>

<p>Совместимость:</p>

<pre>
FF 3.6.8.   - полная
Opera 10.10 - частичная (не верно работают п.6,7,8)
Crome 5.0   - то же
Safary 4.0  - то же
IE 8.0      - то же
IE 6,7      - то же + кривой вывод &lt;DIV&gt; статистики
</pre>

(с) jAvs, Spb, Russia - javsspb.blogspot.com
</textarea><br>
<input name="run" type="button" onclick="wordStat(document.getElementById('text'),10)" value="run">
</form>
</body>
</html>

Буду рад, если кому-то моя работа пригодится. В принципе по ходу можно без труда расширить количество статистических параметров. Знаю, к примеру, что переводчикам нужна статистика текста без чисел (здесь они учитываются). Можно при помощи регулярных выражений подсчитать количество английских и руских слов ну и т.п.

P.S. не вполне разобрался, как опубликовать полностью рабочую HTML страницу. Нашел только Paste BIN, но там демонстрация во фрейме.

+1

Автор: B@rmaley.e><e, дата: 19 августа, 2010 - 21:27
#permalink

Автор: javs, дата: 20 августа, 2010 - 04:04
#permalink

Спасибо, так действительно лучше, но максимально допустимая ширина iframe в моем случе маловата.


Автор: Cr@ZyBoY, дата: 20 августа, 2010 - 14:42
#permalink

В ff вы, почему то, последнем проверили, а вот версия Оперы больно старовата. Напишите результаты для 10.61.


Автор: javs, дата: 20 августа, 2010 - 15:57
#permalink

Не только Opera, но и у меня Safary старовата, IE вообще 7.0 еще, да и FF не 4-й ветки. Прочие браузеры я вынужден держать именно для проверки совместимости, поэтому не спешу их обновлять. Рад за Opera если там уже все работает.


Автор: Cr@ZyBoY, дата: 20 августа, 2010 - 20:01
#permalink

Дык кто мешает сразу установить несколько версий разных браузеров? У меня, например, есть Opera (9.27, 9.64, 10.10, 10.50, 10.61), Firefox (2, 3, 3.6), Safari 5, Chrome 5, IE 8, IETester (IE 5.5-8.0)


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
7 + 1 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
javs
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum