LINUX.ORG.RU

[программирование]Анализ текста

 


0

1

Исходный текст

Мама мыла раму

После анализа

мама - 1
мыла - 1
раму - 1

Возможно ли написание такой программы?

Правда есть мысль, что если взять текст, сравнимый по количеству символов, допустим, с «Войной и Миром», то процесс будет стремиться к бесконечности.


сравнимый по количеству символов, допустим, с «Войной и Миром», то процесс будет стремиться к бесконечности.

В лучшем случае 20 мегабайт текста разобрать на слова? lol.

baverman ★★★
()
Ответ на: комментарий от fedor

пожалуйста, но вообще такие вопросы задавать в Devel, там шанс получить адекватный ответ на подобный вопрос чуть выше (пожалуй это единственное исключение)

lazyklimm ★★★★★
()

> Возможно ли написание такой программы?

Разбить текст на слова и подсчитать их количество? Возможно. Я разрешаю.

drull ★☆☆☆
()

Вопрос-то в чём? Посчитать количество упоминаний слов в конкретной форме в тексте? Или посчитать количество слов, в какой бы форме оно в тексте ни было? Если второе, то - если не нужно идеальной точности - стеммер в помощь.

Smacker ★★★★★
()
Ответ на: комментарий от fedor

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

Smacker ★★★★★
()

Думаю perl самый раз подойдет для этого, он как раз задумывался как язык обработки текста

deterok ★★★★★
()
Ответ на: комментарий от fedor

Нашёл. Вот: http://www.keva.ru/stemka/stemka.html , опен-сорс.
Разбивает слова на предпологаемые морфемы с довольно большой точностью, примерно так:

админвзыскан|ие
админвзыскан|и|я
админвзыскан|и|ю
админвзыскан|и|ем|
админвзыскан|и|и
админвзыскан|и|й
админвзыскан|и|ям
админвзыскан|и|ями
админвзыскан|и|ях|
крова|т|ь
свежесобра|н|н|ый
красив|ый
швидки|й

Стеммер, конечно, не столько выделяет морфемы, сколько неизменяемую часть слова, но для примерного подсчёта слов сойдёт.

Smacker ★★★★★
()
Ответ на: комментарий от deterok

Угу, само собой. Только сначала надо морфологический анализатор на нём написать, а потом уже всё ОК будет.

Smacker ★★★★★
()
Ответ на: комментарий от deterok

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

И что же там такого кроме регулярных выражений, которые есть и в других языках?

baverman ★★★
()
Ответ на: комментарий от fedor

Если надо считать количество слов независимо от того, в какой форме они используются, надо как-то докопаться до «исходного» слова. По науке это делается морфологическим анализатором для соответствующего языка, но я опенсорсных и готовых к употреблению не видал. Второй вариант - выделить на основе статистических данных по языку некоторую неизменяемую часть слова. Слова, у которых она одна и та же - скорее всего, одно и то же слово (надо ещё сделать, конечно, оглядку на суффиксы и префиксы). Это делает стеммер.

Smacker ★★★★★
()
Ответ на: комментарий от Smacker

Если я правильно понял, то задача куда проще. Разбивание не требуется. Т.е. «админ» и «админы» считаются отдельно, а не как админ|X. Но принцип ясен.

fedor
() автор топика
Ответ на: комментарий от fedor

Ну тогда считывай текстовый файл до пробела и инкрементируй значение соответствующего ключа в хеше. Если реально очень много значений (что вряд ли, в русском что-то типа 200 000 слов при средней длине, вроде, в 8 знаков - то есть что-то типа полутора метров), можешь БД заюзать какую-нибудь, типа SQLite.

Smacker ★★★★★
()
Ответ на: комментарий от deterok

>Думаю perl самый раз подойдет для этого, он как раз задумывался как язык обработки текста

Ты глубоко заблуждаешься.

(Мне в Python'е больше всего понравилась работа со строками - там это действительно удобно).

drakmail ★★★★
()

echo «Мама мыла раму» | sed s/" «/\\n/g | sed s/$/» - 1"/g

Можешь не благодарить.

ЗЫ В наших госструктурах вот такие гении и пишут ТЗ программистам.

muon ★★★★
()

>Правда есть мысль, что если взять текст, сравнимый по количеству символов, допустим, с «Войной и Миром», то процесс будет стремиться к бесконечности.

Нет конечно, линейный рост только. Это же не парное выравнивание символов нескольких текстов

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от DNA_Seq

>(Рэндал Шварц - Изучаем Perl)

Короче, 2е задание 5й главы, ответы есть в конце

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от baverman

Вопрос удобства. А так и на брейнфаке все реализовать можно, язык же тьюринг-полный

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от Smacker

Спасибо, интересная ссылка. Раньше приходилось просто отбрасывать окончания (список окончаний слов в русском языке легко найти).

amomymous ★★★
()
Ответ на: комментарий от pacify

Работает с одним минусом - слово, со стоящей после него точкой или запятой, считает отдельным. т.е. «привет» и «привет,». Как-то так.

fedor
() автор топика
Ответ на: комментарий от fedor

значит надо почистить [:punct:] через sed:
$ echo ".abc." | sed 's/[[:punct:]]//g'
abc

pacify ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.