LinuxForum.Fans
Тема

Shell-процедура. Поиск омонимов (одинаковых слов)

Автор: qwerty 25 сообщений 9577 просмотров
#253926

Здравствуйте!
Помогите пожалуйста написать shell-процедуру под UNIX.

Задание:

Написать shell-процедуру, которая:
• В заданном первым параметром файле находит все слова-омонимы;
• Выводит на экран строки, содержащие омонимы;
• Подсчитывает в каждой строке число символов, совпадающих с заданным вторым параметром символом, и выводит его на экран


Желательно прокомментировать.

Омонимы - слова, которые пишутся одинаково, но имеют разный смысл. Здесь, видимо, имеются в виду одинаковые слова.

Когда я спрашивал, препод вообще ничего не мог сказать по поводу, что тут подразумевалось под омонимом; судя по всему, он и слова-то такого - "омоним" не знает...

Так что пусть будет означать, что ищем в тексте одинаковые слова. Если они есть - то с ними и работаем дальше.



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

#269920

А можете привести пример текста в котором нужно найти слова?

#269983
wlad.bologov написал:
А можете привести пример текста в котором нужно найти слова?

при чем тут структура текста?
человеку нужно найти все повторяющиеся слова.
я вижу это следующим образом:
последовательное сканирование каждого слова в тексте с одновременным поиском этого каждого слова на предмет повтора.

#269986
"qwerty" написал:
Я полагаю не больше 100, максимум 150 рублей...

Похоже на д.кр, или л/р, 100р ИМХО мало, 500 и выше, хотя если гуглом умеете пользоваться, то найдете решение сами.

#269987

я тоже примерно знаю как это реализовать.
1.разбить текст на слова
2.убрать знаки припинания через sed
3.отсортировать
4.найти одинаковые слова
5.через grep найти строки



последний пункт еще думаю(подсчет символов), но примерно знаю как реализовать. не ради денег, но ради тренировки. скоро могу предоставить код.

#269991
wlad.bologov написал:
я тоже примерно знаю как это реализовать.
1.разбить текст на слова
2.убрать знаки припинания через sed
3.отсортировать
4.найти одинаковые слова
5.через grep найти строки



последний пункт еще думаю(подсчет символов), но примерно знаю как реализовать. не ради денег, но ради тренировки. скоро могу предоставить код.

1. заменить все знаки препинания на символ новой строки.
2. уже решено
3. отсортировать
4. каким образом? тоже через грип с комбинацией | wc -l ?
5.через grep найти строки
ну дык, греп по мойму умеет отображать номера строк найденого рега.

#269993

минимальная длинна слова какая?
предлоги всякие тоже надо?

слово I (я) к примеру тоже учитывать?

#270006
"moshell" написал:
я вижу это следующим образом:
последовательное сканирование каждого слова в тексте с одновременным поиском этого каждого слова на предмет повтора.

садись, два.

Note: сложность вашего решения пропорциональна O(N*N)
Hint: можно составить список слов, а потом его отсортировать (man sort), затем отфильтровать повторы (man uniq). Если при этом не забыть прицепить к каждому слову номер строки в исходном тексте, то мы сможем распечатать эти строки. Сложность O(N*log(N))

"i2ks" написал:
Похоже на д.кр, или л/р, 100р ИМХО мало, 500 и выше

можно и 350руб наверное. Таки пост майский, наверное не актуально.

"wlad.bologov" написал:
я тоже примерно знаю как это реализовать.
1.разбить текст на слова
2.убрать знаки припинания через sed
3.отсортировать
4.найти одинаковые слова
5.через grep найти строки

ага. можно и так.
В тему: Скрипт для подсчёта слов.

#270040

на правах быдлокодера,
еще пилить и пилить.
опять же со знаками, в ядре 2.6 убрался знак "." и получилось одно слово 26. но совпадений по нему нет.
разделить табуляцией чтоб привести в красивый вид.
формат
число_слов слово строки в которых найдено

> cat slovo.test
In everyone's life a little rain must fall. My main Linux workstation at home suffered a hard drive failure the day after Christmas. I can only guess I was bad last year and Santa turned my hard drive into a lump of coal as punishment.

Unfortunately, at some point over the year I introduced a typo in a script I used to backup my personal website and some other data on that particular computer. Along with some data that wasn't very important, I lost my handy little script I used to setup iptables to NAT my internal network to the Internet at large.

After an hour of not being able to find a quick and easy tutorial on how to do this seemingly basic task on Google, I promised myself I would write this Quick-Tip.

If you are running a recent 2.6 Linux Kernel this four step process should work for you. This has been specifically tested on Fedora Core 3, 4, 5, and 6, but should work on any modern Linux distribution. All of these commands must be executed as the root user. First you need to tell your kernel that you want to allow IP forwarding.()
text
> cat script
#!/bin/bash

cat slovo.test | tr ' ' '\n' | sed 's/[\., ]//' | sed 's/[)]//' | sed 's/(//' | sort | grep "." > omonimys_temp

cat omonimys_temp | uniq -c | sed -e 's/^ *//' > tmp

for i in $( cat tmp | sed -e 's/.* //' );do

F=`grep -in "\<$i\>" slovo.test | sed -e 's/^\([0-9]*\).*/\1/' | tr '\n' ' '` echo "$F" >> tmp2

done

paste -d " " tmp tmp2 > dict.txt

rm tmp rm tmp2 rm omonimys_temp

exit 0 [/quote][quote]> cat dict.txt 1 [b]26[/b] 1 3 7 1 4 7 1 5 7 1 6 7 1 After 1 5 1 All 7 1 Along 3 1 Christmas 1 1 Core 7 1 Fedora 7 1 First 7 1 Google 5 8 I 1 3 5 1 IP 7 1 If 7 1 In 1 3 1 Internet 3 1 Kernel 7 3 Linux 1 7 1 My 1 3 1 NAT 3 1 Quick-Tip 5 1 Santa 1 1 This 5 7 1 Unfortunately 3 7 a 1 3 5 7 1 able 5 1 after 1 5 1 allow 7 1 an 5 4 and 1 3 5 7 1 any 7 1 are 7 2 as 1 7 3 at 1 3 1 backup 3 1 bad 1 1 basic 5 1 be 7 1 been 7 1 being 5 1 but 7 1 can 1 1 coal 1 1 commands 7 1 computer 3 2 data 3 1 day 1 1 distribution 7 1 do 5 2 drive 1 1 easy 5 1 everyone's 1 1 executed 7 1 failure 1 1 fall 1 1 find 5 1 for 7 1 forwarding 7 1 four 7 1 guess 1 1 handy 3 2 hard 1 1 has 7 1 home 1 1 hour 5 1 how 5 1 important 3 1 in 1 3 1 internal 3 1 into 1 1 introduced 3 1 iptables 3 1 kernel 7 1 large 3 1 last 1 1 life 1 2 little 1 3 1 lost 3 1 lump 1 1 main 1 1 modern 7 2 must 1 7 4 my 1 3 1 myself 5 1 need 7 1 network 3 1 not 5 3 of 1 5 7 5 on 3 5 7 1 only 1 1 other 3 1 over 3 1 particular 3 1 personal 3 1 point 3 1 process 7 1 promised 5 1 punishment 1 1 quick 5 1 rain 1 1 recent 7 1 root 7 1 running 7 2 script 3 1 seemingly 5 1 setup 3 2 should 7 3 some 3 1 specifically 7 1 step 7 1 suffered 1 1 task 5 1 tell 7 1 tested 7 3 that 3 7 4 the 1 3 7 1 these 7 3 this 5 7 8 to 3 5 7 1 turned 1 1 tutorial 5 1 typo 3 2 used 3 1 user 7 1 very 3 1 want 7 1 was 1 1 wasn't 3 1 website 3 1 with 3 2 work 7 1 workstation 1 1 would 5 1 write 5 2 year 1 3 4 you 7 1 your 7 >

#270042
"moshell" написал:
опять же со знаками, в ядре 2.6 убрался знак "." и получилось одно слово 26

Заменять/удалять знаки препинания, за которыми следует пробел...

#270045
-=Serj=- написал:
[quote="moshell"]опять же со знаками, в ядре 2.6 убрался знак "." и получилось одно слово 26

Заменять/удалять знаки препинания, за которыми следует пробел...[/quote]
красава

#270103
text
#!/bin/bash
clear
slova=`cat "$1"|sed 's/ /\n/g'|sed 's/[\,:;\.\?"]//g'|sort|uniq -d`
echo -e "Слова повторяющиеся в тексте:\n$slova\n\n"
echo "Строки содержащие омонимы:"

for i in "$slova"; do grep "$i" "$1" done

y=`cat "$1"|grep "$2"|wc -l` echo -e "\n\nЧисло символов $2=$y"

#270105

wlad.bologov, скрипт не работает.

P.S.

text
cat "$1"|grep  "$2"|wc -l

Можно проще

text

grep -c "$2" "$1"
#270106
text
Слова повторяющиеся в тексте:
такс
такса

Строки содержащие омонимы: Сев в такси, спросила такса: "За проезд какая такса?" А водитель: "Денег с такс Не берём совсем, вот такс".

Число символов а=4

у меня работает.
Текст с которым работал:
Сев в такси, спросила такса:
"За проезд какая такса?"
А водитель: "Денег с такс
Не берём совсем, вот такс".

#270107
Lupo Alberto написал:
wlad.bologov, скрипт не работает.

P.S.
text
cat "$1"|grep  "$2"|wc -l

Можно проще

text

grep -c "$2" "$1"

а что выдает?

#270110

Вероятно, я поторопился с «обвинениями», извините.

#270111
Lupo Alberto написал:
Вероятно, я поторопился с «обвинениями», извините.

ничего страшного. я очень рад что все работает.

#270112
Lupo Alberto написал:
Вероятно, я поторопился с «обвинениями», извините.

Дал, другой файл, выдал

text
Слова повторяющиеся в тексте:
-
№1
ddrecue
/home/rescue/diskiso
/mnt/rescue
reiserfsck
диска
не
образ
повторяем
утилитой

Строки содержащие омонимы: grep: неверный параметр « » Использование: grep [ПАРАМЕТР]… ШАБЛОН [ФАЙЛ]… Запустите «grep --help» для получения более подробного описания.

Число символов 3=3

#270113

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

Войдите или зарегистрируйтесь, чтобы ответить.