Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.04;
Скачать: CL | DM;

Вниз

Посоветуйте статистическую функцию ? Есть большой текст (Война и   Найти похожие ветки 

 
Кен ©   (2003-07-12 02:50) [0]

мир), нужно подсчитать сколько раз какое слово в нём повторяется. Могу такую функцию написать и сам, но текст большой, поэтому боюсь, что будет сильно тормозить.


 
MSSQL2k   (2003-07-12 03:38) [1]

...можно попробывать с БД.
Нужна одна табличка+1 поле.
В это поле накидываем все имеющиеся слова, а там потом селектом с функцией COUNT + группировка.
:)


 
Кен ©   (2003-07-12 03:58) [2]

> ...можно попробывать с БД.
> Нужна одна табличка+1 поле.
> В это поле накидываем все имеющиеся слова, а там потом селектом
> с функцией COUNT + группировка.
> :)

А без БД ? Просто чтобы текстовый файл был.


 
Кен ©   (2003-07-12 06:39) [3]

Попытался сделать это через ListBox и его свойство Sorted, так оказалось, что у ListBox количество строк не больше 64000. Нет ли какого нибудь ListBox, с неограниченным количеством строк ?


> MSSQL2k (12.07.03 03:38)
> ...можно попробывать с БД.
> Нужна одна табличка+1 поле.
> В это поле накидываем все имеющиеся слова, а там потом селектом
> с функцией COUNT + группировка.
> :)

Где бы мне посмотреть примеров по работе с базами ?


 
Кен ©   (2003-07-12 07:53) [4]

Поискал на Torry крупноразмерный ListBox и ненашёл ...
Ну не отстой ли это ? Почему нельзя было сделать ListBox размером хотя бы в один миллион строк ?

Ведь мы то с вами знаем слов больше чем 64000. А тут их даже записать невозможно. Какой уж тут искусственный интеллект.


 
Sha ©   (2003-07-12 10:20) [5]

Хеш-функции проходил?


 
Anatoly Podgoretsky ©   (2003-07-12 13:29) [6]

Более 64000?
Огласите весть список.
Видимо ты путаешь слова со словоформами.


 
panov ©   (2003-07-12 16:11) [7]

Зайди на http://www.alglib.chat.ru/
Там есть функции, реализующие быстрый алгоритм поиска текста в файлах.


 
Aldor ©   (2003-07-12 19:29) [8]

Не понятно, необходимо найти количество вхождений каких-то определенныъ слов или всех?


 
Тих   (2003-07-12 21:46) [9]

www.analyst.ru, там лежит COM - SDK как раз для этих целей (один из результатов работы этой программы - выстраивание семантической сети после подсчета слов и выстраивание их "по весу")


 
Кен ©   (2003-07-13 01:44) [10]

> Aldor © (12.07.03 19:29)
> Не понятно, необходимо найти количество вхождений каких-то
> определенныъ слов или всех?

Всех


> panov © (12.07.03 16:11)
> Зайди на http://www.alglib.chat.ru/
> Там есть функции, реализующие быстрый алгоритм поиска текста
> в файлах.

Но мне не нужен поиск текста по файлАМ. Файл один. Нужно подсчитать сколько раз какое слово в нём повторяется.

Допустим всего слов 200 000. Уникальных же скажем 10 000, надо узнать сколько раз какое повторяется.
Чтобы получилось примерно вот так :
1) а - 50 раз
2) ай - 10 раз
3) ах - 5 раз
...
10000) я - 500 раз



> Anatoly Podgoretsky © (12.07.03 13:29)
> Более 64000?
> Огласите весть список.
> Видимо ты путаешь слова со словоформами.

А какая разница между словом и словоформой с точки зрения программиста ?
Вроде же нет алгоритма который бы восстанавливал по словоформе слово. Или есть ?
Если есть, то было бы очень инетересно посмотреть его исходники.


 
Кен ©   (2003-07-13 01:53) [11]

> Тих (12.07.03 21:46)
> www.analyst.ru, там лежит COM - SDK как раз для этих целей
> (один из результатов работы этой программы - выстраивание
> семантической сети после подсчета слов и выстраивание их
> "по весу")


Там что то не то.

Комплект SDK:
библиотека программных компонентов (inproc servers);
документация;
набор базовых словарей,необходимых для работы с текстами русского и английского языков;
программа редактора словарей DicEdit.

Но зачем мне словари ? Ни русские, ни английские мне ни к чему.
И семантическая сеть какая то тоже ненужна.
Нужна всего лишь функция статистики.
Такая вот :

function GetStringsStat(InString: TString):TString;


 
Кен ©   (2003-07-13 02:44) [12]

> Тих (12.07.03 21:46)
> www.analyst.ru,

Я скачал. Там какая то программа. И ещё какие то программы на Си. Это не то.


 
2 Кен   (2003-07-13 05:15) [13]

"Дуракам закон не писан" (с)


 
Dmitriy O. ©   (2003-07-13 12:06) [14]

Элементарно Ватсон закачиваеш текст в БД а потом селект и все.


 
Тих   (2003-07-13 12:40) [15]

Кен © (13.07.03 02:44)
Если Вам лень разбираться - ваша воля.
Все зависит от задачи. Если надо один раз разобрать текст - стройте хэш "слово-число". Это будет тупо и быстро. Если же выполнять задачу надо регулярно и интеллектуально с учетом падежей, склонений, спряжений, контекста, возможных опечаток и пр. - таки поизучайте библиотеки типов TextAnalyst`а.


 
Dionys   (2003-07-13 17:47) [16]

простейший скрипт на Perl который считает слова... не различает регистр...


#!/usr/bin/perl

if (@ARGV < 2) {
print "Usage:\n\twords <infile> <outfile>\n";
exit();
}
open IN, "<${ARGV[0]}";
open OUT, "+>${ARGV[1]}";

my %words;

while (<IN>) {
chomp;
foreach (split /[\s\.\,\:\;\"\!\?\(\)\[\]\"\-]+/, $_) {
$words{$_} += 1;
}
}
foreach (keys(%words)) {
write OUT;
}

close IN;
close OUT;

format OUT =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | @#######
$_, $words{$_}
.


вообще лучше для обработки большого количества текстовой информации пользоваться Perl"ом...


 
Fenik ©   (2003-07-13 19:05) [17]

> Кен © (12.07.03 02:50)

> Могу такую функцию написать и сам, но текст большой, поэтому
> боюсь, что будет сильно тормозить.


Ты сначала напиши, а потом смотри как она работает, быстро или нет.

Алгоритм "в лоб": создаешь индексированный список; просматривая текст раскидываешь все слова по списку.

Индексированный список - из 33 элементов (алфавит). Каждый элемент - это такой же список из 33 элементов, только эти элементы - строки. 33*33 = 1089 строк. И в ходе просмотра текста слова раскидываются по этим строкам, разделяясь пробелом, к примеру. Конечно же все слова переводятся в один регистр (нижний). При добавлении какого-либо слова в очередную строку, она (строка) просматривается на наличие данного слова. Если слово присутствует в строке, то рядом с ним ставится число вместо пробела.
Когда "раскидка" закончена, просматриваешь все строки по-порядку и заносишь в список.

Короче говоря, делать можно не так уж долго.


 
Asteroid ©   (2003-07-14 01:28) [18]

Простейший (но не оптимальный) - берешь массив структур (слово, N повторов), читаешь слово из файла, делаешь бинарный поиск по массиву и действуешь по обстоятельствам. Минус - долгая вставка слова в середину (список должен быть отсортирован для бинарного поиска).


 
Кен ©   (2003-07-14 01:51) [19]

> Dionys (13.07.03 17:47)
> простейший скрипт на Perl который считает слова... не различает
> регистр...

Я знаю, как это сделать на Перле и php . Но это форум Дельфи. И программа на Дельфи. Что же мне ещё вмесе с ней ещё и Перл устанавливать ?

вообще лучше для обработки большого количества текстовой информации пользоваться Perl"ом...
При наличии быстрых, соптимизированных функций для работы с текстом в подавляющем большинстве случаев можно обходиться и паскалем.


> Ты сначала напиши, а потом смотри как она работает, быстро
> или нет.

Это вы типа думаете, что я не писал что ли ? Ну нате :

if ValidInt(ValueListEditor1.Values["новое слово"]) then
ValueListEditor1.Values["новое слово"] := IntToStr(StrToInt(ValueListEditor1.Values["новое слово"])+1)
else
ValueListEditor1.Values["новое слово"] := "1";



> Dmitriy O. © (13.07.03 12:06)
> Элементарно Ватсон закачиваеш текст в БД а потом селект
> и все.

Если это так эллементарно, то напишите тут код или дайте ссылку на подобный код.


 
Asteroid ©   (2003-07-14 02:07) [20]

Да, кстати: если хочешь побыстрее - не используй визуальные компоненты при загрузке. В крайнем случае прячь. Обновляться будут, мягко говоря, долго.


 
Dionys   (2003-07-14 02:25) [21]

тогда воспользуйся хэшем в Delphi...

если с БД то в MySQL это будет выглядеть так... создаем таблицу:

CREATE TABLE words (word VARCHAR(100));

затем загоняем в нее все слова... и делаем такую выборку:

SELECT word, COUNT(*) FROM words GROUP BY word;

получим два столбца: в первом - слово, во втором - сколько раз оно встречается...


 
АлексейК   (2003-07-14 04:24) [22]

Могу такую функцию написать и сам, но текст большой, поэтому боюсь, что будет сильно тормозить.
Что бы не томозило, нужно подобрать оптимальный алгоритм поиска. Например, КМП алгоритм или комбинированный. Неполохо это описано у Н.Вирта "Алгоритмы и структуры данных."


 
Кен ©   (2003-07-17 06:47) [23]

> АлексейК (14.07.03 04:24)
>> Могу такую функцию написать и сам, но текст большой, поэтому
>> боюсь, что будет сильно тормозить.
> Что бы не томозило, нужно подобрать оптимальный алгоритм
> поиска. Например, КМП алгоритм или комбинированный. Неполохо
> это описано у Н.Вирта "Алгоритмы и структуры данных."

Если у них это написано, то хорошо бы ихний код запостить сюда. Чтобы велосипед не изобретать.

----
Я кстати нашёл, что работает с большим количеством строк. Это StringGrid. Но на сортировке сильно тормозит. В ЛистБоксе же это секунды.


 
Думкин ©   (2003-07-17 07:17) [24]

Кен © (17.07.03 06:47)
Ты что же все в визуале хочешь? Не перегрелся?
Ты еще после каждой словесной выборки делай Fpplication.ProcessMessages и заставля й компутер играть бравурную мелодию.


 
OHP   (2003-07-18 01:03) [25]

А почемы бы тебе листбокс на StringList не заменить - куда быстрей будет...



Страницы: 1 вся ветка

Текущий архив: 2003.08.04;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.014 c
1-10249
Alex_x
2003-07-21 10:07
2003.08.04
Помогите нарисаовать график в Excele


1-10252
gSergei
2003-07-21 13:57
2003.08.04
Поиск файла


1-10269
zolotov
2003-07-21 15:57
2003.08.04
Проблема с копированием и вырезанием данных в F1Book


14-10394
frost
2003-07-11 22:53
2003.08.04
Базы Paradox и различные файловые системы


6-10335
Alexander Pogodin
2003-05-28 17:00
2003.08.04
TWebBrowser.OnBeforeNavigate2