Форум: "Потрепаться";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
ВнизПосоветуйте статистическую функцию ? Есть большой текст (Война и Найти похожие ветки
← →
Кен (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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c