Существует ли программа, составляющая алфавитный список слов (словарь) заданного текста?
----------------
алфавитный
заданный
ли
программа
словарь
слово
составляющий
список
существует
текст
Скрипт на любом языке программирования.
Причём в куче языков уже есть функция сортировки по дефолту, так что всё, что делает скрипт: это загоняет слова в массив или ещё куда...
В одном из моих любимых текстовых редакторов RulNote есть функция build wordlist. Правда, он сортирует их по частотности, но расставить слова по алфавиту — это еще пара кликов.
1. Автозамена все знаки препинания > ноль.
2. Автозамена пробел > перенос строки.
3. Копируем в эксель, кликаем и радуемся.
А е и ё эксель различает?
Недавно разбирал такой программкой капуанскую черепицу для ostapenkovr. Программка на яве, небольшая, строк этак 20...
Прочитайте начальное сообщение внимательнее. Кажется, автору темы нужно ещё и имена в начальную форму ставить:
заданного → заданный
слов → слово
составляющая → составляющий
заданного → заданный
текста → текст
(Однако, не глаголы: существует → существует)
Так что скриптом в пару строчек тут не обойтись.
Может, товарищу нужен лемматизатор? Типа лемматизатора Алексея Сокирко?
Написать программу, разбивающую текст на слова и сортирующую их в алфавитном порядке — несложно. На Clojure это будет примерно так:
(->> (slurp "inputfile.txt") ; чтение файла
(re-seq #"\p{L}+") ; поиск последовательностей букв
set sort ; исключение дубликатов и сортировка
(reduce #(str %1 "\n" %2)) ; объединить слова в текст, разбитый на строчки
(spit "outputfile.txt")) ; запись в файл
Но, я так понял, нужно еще и угадывать, как слово будет выглядеть в начальной грамматической форме? Вторую часть осуществить практически невозможно: если брать чисто по внешнему виду, программа будет постоянно кровать и батареть, да и если использовать словарь (хотя какой словарь, если мы его не составили?), возможны ошибки на омонимах в косвенных падежах (напр., пирог в родительном и пиро́га в именительном пишутся идентично).
Цитата: Python от июля 6, 2012, 06:09
хотя какой словарь, если мы его не составили?
А почему обязательно «мы»?
Цитата: http://speakrus.ru/dict/
Полная акцентуированная парадигма по А. А. Зализняку
86839 статей, 2645347 форм
TXT + RAR (5961 Кб) Скачать
Источник Образец текста
Идея и программное обеспечение (С) Андрей Усачёв (2:5100/87), 2004
Ещё можно использовать
(LW) mystem от Яндекса, но а) в последнее время возможность его скачивания убрали (или я плохо искал?), б) он выдаёт результат в несколько нестандартном виде (так, он объединяет некоторые переходные и непереходные глаголы).
Вообще, конечно, автоматическое приведение к словарной форме неизбежно будет выдавать ошибочные варианты, но если помнить об этом, оно всё-таки будет достаточно полезно. Оставляю за Пѵѳономъ написание программы на Clojure, которая ещё и приводит всё к начальной форме.
Кстати, думаю, Максимму кроме самой программы нужна будет и инструкция по работе с ней. ;D
Цитата: Python от июля 6, 2012, 06:09
(re-seq #"\p{L}+") ; поиск последовательностей букв
Цитата: http://clojuredocs.org/clojure_core/clojure.core/re-seqReturns a lazy sequence of successive matches of pattern in string, using java.util.regex.Matcher.find(), each such match processed with re-groups.
Цитироватьlazy sequence
Вот когда я начинаю завидовать клоџурщикам...
Конечно, такое можно сделать и в Scheme, но не сделали же...
Цитата: wangjhenbai от июля 6, 2012, 09:40
Цитата: Python от июля 6, 2012, 06:09
(re-seq #"\p{L}+") ; поиск последовательностей букв
Цитата: http://clojuredocs.org/clojure_core/clojure.core/re-seqReturns a lazy sequence of successive matches of pattern in string, using java.util.regex.Matcher.find(), each such match processed with re-groups.
Цитироватьlazy sequence
Вот когда я начинаю завидовать клоџурщикам...
В нашем случае, lazy-sequence сразу же прокручивается через set и sort, поэтому от laziness здесь пользы никакой.
Большое спасибо за отклик на мой вопрос и конструктивные советы. Насчёт перевода в начальную форму. Да, наверное, было бы рационально переводить в начальную форму. Глагол в моём примере я должен был поставить тоже в инфинитив. Как-то пропустил и не сделал этого.
Зачем это нужно. Берёшь книгу на языке, который учишь. Вставляешь текст. Программа выкидывает на выходе словарик всех слов, употреблённых в данном тексте (книге). Дальше просматриваешь этот словарик, замечаешь слова, которых ещё не знаешь, справляешься в электронном словаре о значении. Дальше можно спокойно читать книгу, не отвлекаясь.
Мне кажется, так было бы удобно.
P.S. Да хотя бы и не переводить в начальную форму, сойдёт и без этого. Лишь бы убрать все словарные повторы, а остаток превратить в форму списка.
Цитата: Максимм от июля 6, 2012, 21:26
Да хотя бы и не переводить в начальную форму, сойдёт и без этого. Лишь бы убрать все словарные повторы, а остаток превратить в форму списка.
Это как раз то, что делает моя программка. Шлите исходный текст для эксперимента...
Цитата: Python от июля 6, 2012, 06:09
Написать программу, разбивающую текст на слова и сортирующую их в алфавитном порядке — несложно. На Clojure это будет примерно так:
(->> (slurp "inputfile.txt") ; чтение файла
(re-seq #"\p{L}+") ; поиск последовательностей букв
set sort ; исключение дубликатов и сортировка
(reduce #(str %1 "\n" %2)) ; объединить слова в текст, разбитый на строчки
(spit "outputfile.txt")) ; запись в файл
Too long, too ugly. The best solution:
tr -c '[:alpha:]' '\n' < text | sort -u > wordlist
Цитата: Максимм от июля 6, 2012, 21:26
P.S. Да хотя бы и не переводить в начальную форму, сойдёт и без этого. Лишь бы убрать все словарные повторы, а остаток превратить в форму списка.
Как раз это и делает программа Python'а, которую он привёл выше. :yes:
Цитата: shell от июля 8, 2012, 13:24
tr -c '[:alpha:]' '\n' < text | sort -u > wordlist
I've just tested it in Cygwin. It is good for basic ASCII, but Cyrillic letters are not :alpha:, so they're skipped too.
Цитата: Python от июля 8, 2012, 14:12
Цитата: shell от июля 8, 2012, 13:24
tr -c '[:alpha:]' '\n' < text | sort -u > wordlist
I've just tested it in Cygwin. It is good for basic ASCII, but Cyrillic letters are not :alpha:, so they're skipped too.
Cyrillic-compatible solution:
cat text | tr '[\000-\100\133-\140\173-\177]' '\n' | sort -u >wordlist
Цитата: Python от июля 8, 2012, 17:27
Cyrillic-compatible solution:
Code: [Select]cat text | tr '[\000-\100\133-\140\173-\177]' '\n' | sort -u >wordlist
А unicode-compatible solution-то есть?
Цитата: Тайльнемер от июля 8, 2012, 18:59
А unicode-compatible solution-то есть?
Clojure позволяет работать с юникодом, в т.ч. и в регексах (в первом примере \p{L} — поиск всех символов, определенных в юникоде как буквы). Впрочем, мой вариант для юниксовых утилит должен работать и с юникодом, при условии, что в тексте используется только ascii-совместимая пунктуация.