Счетчик слов в тексте

Опубликовал Ярослав Волохов (YVolohov) в раздел Обработки - Универсальные обработки

Обработка подсчитывает частоту и долю каждого слова в тексте. Будет полезна при изучении иностранных языков.

Обработка создана для помощи при изучении английского языка. Дает возможность выбрать ключевые, наиболее часто употребляемые слова из любого текста.

Соответственно помогает определить, что учить в первую очередь.

Скачать файлы

Наименование Файл Версия Размер
Счетчик слов
.epf 9,38Kb
19.05.10
39
.epf 9,38Kb 39 Скачать бесплатно

См. также

Комментарии
1. Влад Косилов (kosilov) 235 19.05.10 12:15 Сейчас в теме
Могу порекомендовать использовать следующую функцию для разбивки текста на слова.
По моим тестам этот подход оказался более быстрым, чем использование СтрЗаменить.
Функция split(СимволыРазделители, строка, лимит = неопределено) экспорт
	
НоваяСтрока = Строка;
МассивСлов = новый Массив;
ИщемНачало = истина;
ТекСлово = "";

Для НомерСимволаСтроки=1 по СтрДлина(Строка) цикл
	ТекСимвол =  Сред(Строка,НомерСимволаСтроки,1);
 	если Найти(СимволыРазделители, ТекСимвол)=0  тогда
		ТекСлово = ТекСлово + ТекСимвол;
		ИщемНачало = ложь;
		продолжить;
	иначеесли ИщемНачало тогда
		МассивСлов.Добавить("");
		если МассивСлов.Количество()=лимит тогда
			возврат МассивСлов;
		конецесли;
		продолжить;
	иначе
		МассивСлов.Добавить(ТекСлово);
		если МассивСлов.Количество()=лимит тогда
			возврат МассивСлов;
		конецесли;
		ТекСлово = "";
		ИщемНачало = истина;
	конецесли;
конеццикла;
если Не ИщемНачало тогда
	МассивСлов.Добавить(ТекСлово);
конецесли;
возврат МассивСлов;
конецфункции
...Показать Скрыть

2. Ярослав Волохов (YVolohov) 698 19.05.10 12:32 Сейчас в теме
(1) Спасибо. Постараюсь сегодня же протестировать.
3. Ярослав Волохов (YVolohov) 698 19.05.10 13:13 Сейчас в теме
(1) Протестировал. Функция показала хороший результат, но только для небольших строк. Для больших строк СтрЗаменить() все таки работает значительно быстрее.
4. Влад Косилов (kosilov) 235 19.05.10 23:37 Сейчас в теме
(3) Странно, у меня как раз наоборот получалось. При больших текстах СтрЗаменить начинала тормозить. Может специфика реализации.
А если обрабатывать большие тексты блоками?
Т.е. в функцию разбивки передавать блок плюс остаток от предыдущего блока (если он был), функция разбивки будет возвращать массив (его лучше не возвращать а просто по ссылке с ним работать) + плюс начало слова, если последние символы не разделители.
Думаю так быстрее получиться.
5. Влад Косилов (kosilov) 235 20.05.10 00:06 Сейчас в теме
(3) Я емею в виду так попробовать:
Процедура ПосчитатьСлова2()
	ДлинаБлока = 20; // Здесь надо искать оптимальное значение    
	НоваяСтрока = ЭлементыФормы.Текст.ПолучитьТекст(); 
	СимволыРазделители = ",.?!:;() " + Символ(34);
	// Создаем таблицу значений
	Слова = Новый ТаблицаЗначений;
	Слова.Колонки.Добавить("Слово");
	Слова.Колонки.Добавить("Частота");
	Слова.Колонки.Добавить("Доля");
	
	 
	ИщемНачало = истина; 
	ТекСлово = ""; 
	НачПозиция = 1;
	ДлинаСтроки = СтрДлина(НоваяСтрока);
	
	Пока  НачПозиция<=ДлинаСтроки цикл
		СтрокаОбработки = Сред(НоваяСтрока, НачПозиция, ДлинаБлока);
		    СтрДлина = СтрДлина(СтрокаОбработки);
		Для НомерСимволаСтроки=1 по СтрДлина цикл 
			ТекСимвол =  Сред(СтрокаОбработки,НомерСимволаСтроки,1); 
			если Найти(СимволыРазделители, ТекСимвол)=0  тогда 
				ТекСлово = ТекСлово + ТекСимвол; 
				ИщемНачало = ложь; 
				продолжить; 
			иначеесли ИщемНачало тогда 
				//МассивСлов.Добавить(""); 
				 
				продолжить; 
			иначе 
						НовСтрока = Слова.Добавить();
						НовСтрока.Слово = НРег(ТекСлово);
						НовСтрока.Частота = 1;
						НовСтрока.Доля = 0;
  				ТекСлово = ""; 
				ИщемНачало = истина; 
			конецесли; 
		конеццикла; 
		 
		НачПозиция = НачПозиция + ДлинаБлока;
	КонецЦикла;
	если Не ИщемНачало тогда 
		НовСтрока = Слова.Добавить();
		НовСтрока.Слово = НРег(ТекСлово);
		НовСтрока.Частота = 1;
		НовСтрока.Доля = 0;
 
	конецесли;
	Слова.Свернуть("Слово","Частота,Доля");
	Слова.Сортировать("Частота Убыв, Слово Возр");
	КоличествоСлов           = Слова.Итог("Частота");
	КоличествоУникальныхСлов = Слова.Количество();
	
	// Рассчет доли каждого слова в процентах
	Для Каждого СтрокаТаблицы Из Слова Цикл
		СтрокаТаблицы.Доля = Формат(СтрокаТаблицы.Частота/КоличествоСлов * 100, "ЧЦ=10; ЧДЦ=2");
	КонецЦикла;
	
	// Выводим результат
	ПечатьРезультата(Слова);
	ЭлементыФормы.Панель.ТекущаяСтраница = ЭлементыФормы.Панель.Страницы.Анализ;

КонецПроцедуры
...Показать Скрыть

6. Алексей Константинов (alexk-is) 6114 20.05.10 00:10 Сейчас в теме
Работу блоками при обработке больших текстов можно посмотреть здесь http://www.infostart.ru/public/19856/
7. Сергей (ildarovich) 4975 10.10.11 22:52 Сейчас в теме
В публикации Порождающий запрос в качестве примера решена задача разбивки текста на слова и определения частоты слов непосредственно в запросе.
Оставьте свое сообщение