Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.190.144] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
D_KEY, а давай ты и я внесем в свой код правки - в качестве разделителей дополнительно считать разделителями < > ' " ) ( , . - + : ; ! ?
Ну и посмотрим, сколько нам потребуется кликов для доработки? Скрытый текст Если че, у меня все готово ... #!/usr/bin/perl open (FD,$ARGV[0]) || die "Shit!"; map {$Freq{$_}++;} split /[-+\(\)\.,:\+\s;><"'\?!]+/, join "", <FD>; close (FD); map {print $_." : ".$Freq{$_}."\n";} sort {$Freq{$b}<=>$Freq{$a}} keys %Freq; |
Сообщ.
#17
,
|
|
|
Хотел или нет, это неважно. Просто, помоему, задача, слишком синтетическая, чтобы дать практически полезный результат. Это именно что холивар, тоесть пиписькомер. А внешний размер, далеко не главное. Вы бы чем-нибудь более полезным занялись! А если же по коду... Ну очевидно же, что разбивать строки на новые строки не эффективно. Надо запоминать начало и конец слова в объекте. А уже эти объекты обрабатывать. |
Сообщ.
#18
,
|
|
|
Цитата Eric-S @ А если же по коду... Ну очевидно же, что разбивать строки на новые строки не эффективно. Надо запоминать начало и конец слова в объекте. А уже эти объекты обрабатывать. Ну так это делается с помощью конечного автомата. Однако и регулярки - тот же конечный автомат, только предварительно компилируемый во время исполнения. Более того, в сишной библиотеке PCRE ничего не разбивается - там возвращается массив индексов соответствия паттерну. В Perl'е встроенный механизм другой. Поэтому тебе наверное стоит написать именно разработчику языка о том, что он не прав |
Сообщ.
#19
,
|
|
|
Регулярки тормозить будут, мама не горюй.
|
Сообщ.
#20
,
|
|
|
Цитата applegame @ Регулярки тормозить будут, мама не горюй. За удобства нужно платить. Тем не менее, при составлении регулярок есть некоторое (хотя и слабое) соответствие составлению запросов на SQL. И на SQL-ле можно составить запрос так, что сервер попросит прощения человеческим голосом. Не спорю, лучше зарядить уж связку Bison/Flex - но, имхо, это уж очень узко-специализированные применения, где выжимать нужно по максимуму. Регулярок "в быту" за глаза хватает. |
Сообщ.
#21
,
|
|
|
Цитата JoeUser @ Удобства? По мне так из пушки по воробьям. Неужели в перле нет простого сплита без регулярок? И кстати, твоя программа осилит файло в UTF-8?За удобства нужно платить. Тем не менее, при составлении регулярок есть некоторое (хотя и слабое) соответствие составлению запросов на SQL. Вот решение задачи на D (текст должен быть в UTF-8), без оптимизаций, файло тупо грузится целиком в оперативу: import std.file; import std.stdio; import std.array; import std.algorithm; void main(string[] args) { int[string] words; readText(args[1]) .splitter!(c => canFind(" \n\r\t<>'\")(,.-+:;!?", c)) .filter!(w => !w.empty) .each!(w => words[w]++); words .byKeyValue .array .sort!((a, b) => a.value > b.value) .each!(p => writefln("%s: %s", p.key, p.value)); } Цитата JoeUser @ Накой для такой примитивной задачи Bison/Flex? Не спорю, лучше зарядить уж связку Bison/Flex - но, имхо, это уж очень узко-специализированные применения, где выжимать нужно по максимуму. Регулярок "в быту" за глаза хватает. Тестовй файлик: Прикреплённый файлtest.txt (15,28 Кбайт, скачиваний: 196) |
Сообщ.
#22
,
|
|
|
Цитата applegame @ Неужели в перле нет простого сплита без регулярок? Нету. Может библиотечные и есть, но языковая конструкция - только на регулярках. Цитата applegame @ И кстати, твоя программа осилит файло в UTF-8? Нужно добавить в начало "use encoding 'utf8';" тогда осилит. Цитата applegame @ Вот решение задачи на D Ниче так - кросава Цитата applegame @ Накой для такой примитивной задачи Bison/Flex? Да в начале разговора вообще шла тема запредельных нагрузок, поэтому и решил, что построить автоматы надо заранее. |
Сообщ.
#23
,
|
|
|
Цитата applegame @ Вот решение задачи на D Очень похоже на Ruby H = {} File.open("Testo.txt","r:UTF-8"){|f| f.read} .split(/[-+\(\)\.,:\+\s;><"'\?!]+/) .collect{|w| H[w] = H[w].to_i.succ} H.sort_by(&:last) .reverse!.each {|k,v| puts "#{k} : #{v}\n"} |
Сообщ.
#24
,
|
|
|
Цитата applegame @ Вообще-то bison не нужен, достаточно одного flex'а. Программа должна получиться строк на десять, не больше. Накой для такой примитивной задачи Bison/Flex? |
Сообщ.
#25
,
|
|
|
Цитата amk @ Вообще-то bison не нужен, достаточно одного flex'а. У тебя есть практика использования? |
Сообщ.
#26
,
|
|
|
Цитата amk @ Прекрасно, давай ее сюды. Программа должна получиться строк на десять, не больше. |
Сообщ.
#27
,
|
|
|
Цитата JoeUser @ Я пользовался когда-то lex и C.Цитата applegame @ А она что, кому-нибудь нужна? Просто мне лень ставить нужные для проверки кода программы. Прекрасно, давай ее сюды. Добавлено Если бы мне эту задачу пришлось решать, я бы её на питоне решал. from re import finditer from collections import Counter from sys import argv wordcount = Counter() for line in open(argv[1], 'rt', encoding='cp1251'): for word in finditer('[^-+().,:\s;><"\'?!]', line) wordcount[word] += 1 for count, wors in sorted((c, w) for w, c in wordcount.items()): print(word, count) Вот примерно так. |
Сообщ.
#28
,
|
|
|
Цитата amk @ '[^-+().,:\s;><"\'?!]' Подозрительная регулярка - имхо, кривая. |
Сообщ.
#29
,
|
|
|
Да, перед s надо двойной бэкслэш поставить
А всё остальное там правильно. В квадратных скобках почти все спецсимволы теряют своё специальное значение. |
Сообщ.
#30
,
|
|
|
Цитата amk @ почти все спецсимволы Со знаком минус нужно быть аккуратнее, если нужен именно символ "-" - нужно его ставить последним, перед закрывающей скобкой. Добавлено Равно как и "шапочка" ^, чтобы она не значила отрицания. Добавлено shm, раз уж пошла такая пьянка ... запили работающий код питона на ideone.com, читаем не из файла, а из строки с переводами строк, возвратами каретки и всякими там табуляциями. Будет нагляднее. |