Sida 1 av 1

Ersätta felstavad sträng med rättstavad dito

Postat: 29 sep 2009, 04:32
av dmz
Trådtiteln säger väl allt, eller inte. :p

Jag har iallafall knåpat ihop ett script för att underlätta spellistehantering i mpd, och det ser ut som följer;

Kod: Markera allt

#!/bin/sh
# mpdfav
# WTFPL etc.
#
# Feel free to patch and send me the diff

## Thu Sep 17 18:14:03 CEST 2009
# fixed 'bug' with empty id3-tags and retarded people who cannot spell
#

## Sat Sep 12 07:57:56 CEST 2009
# Creating playlists based on date was pretty useless for me; instead, it now
# reads the 'genre'-id3-tag. 



# First off, some nice colors ey?
GRAY="\033[1;30m"
LIGHT_GRAY="\033[0;37m"
CYAN="\033[0;36m"
LIGHT_CYAN="\033[1;36m"
ORANGE="\033[1;31m"
NO_COLOR="\033[0m"

BOLD="\033[1m"

# Where do you want your playlists hidden?
LISTDIR=/mnt/Music_1/Playlists
GENRE=$(mpc --format %genre%|head -1)


# If called with an argument, that'll be the name of the playlist
if [ "$1" ]; 
then
	NAME="$1.m3u"

elif [ -z $GENRE ];
then
        NAME="random.m3u"
else
	NAME="$(echo $GENRE|tr A-Z a-z|sed 's/[Pp]sychadelic/psychedelic/').m3u"
fi

# Check if file exists ... 
if [ -f "$LISTDIR/$NAME" ]; 
then
	mpc --format %file%|head -1 >> "$LISTDIR/$NAME"

# If not... (some people claim this is useless since >> would automagically
# create the file if it does not exist)
else
	mpc --format %file%|head -1 > "$LISTDIR/$NAME"
fi

echo -e "$BOLD $ORANGE
CONTENT: $NO_COLOR\n
$CYAN`cat "$LISTDIR/$NAME"`$NO_COLOR \n$ORANGE 
`cat "$LISTDIR/$NAME"|wc -l`$NO_COLOR tracks in $GRAY "$LISTDIR/$NAME"
$NO_COLOR
$BOLD $ORANGE
Latest: $NOCOLOR$CYAN`cat "$LISTDIR/$NAME"|tail -1`$NO_COLOR
"
Det jag stör mig på är alltså användningen av sed här;

Kod: Markera allt

	NAME="$(echo $GENRE|tr A-Z a-z|sed 's/[Pp]sychadelic/psychedelic/').m3u"
Väldigt, väldigt fult. Hur löser man detta på ett snyggare sätt? Kanske jämföra $GENRE med en array av möjliga felstavningar, för att isåfall ersätta med en korrekt? Inte heller det kommer att vara 100%-igt, men kanske lite snyggare?

Re: Ersätta felstavad sträng med rättstavad dito

Postat: 29 sep 2009, 16:57
av per9000
Jag hade satsat på att lusläsa

Kod: Markera allt

man ispell
.

http://www.math.sc.edu/system/man/ispell.html

/P

Re: Ersätta felstavad sträng med rättstavad dito

Postat: 02 okt 2009, 19:42
av dmz
Ingen?

Re: Ersätta felstavad sträng med rättstavad dito

Postat: 08 okt 2009, 23:24
av dmz
Bumpar igen. :/

Re: Ersätta felstavad sträng med rättstavad dito

Postat: 09 okt 2009, 07:45
av Konservburk
dmz skrev:Det jag stör mig på är alltså användningen av sed här;

Kod: Markera allt

	NAME="$(echo $GENRE|tr A-Z a-z|sed 's/[Pp]sychadelic/psychedelic/').m3u"
Väldigt, väldigt fult. Hur löser man detta på ett snyggare sätt? Kanske jämföra $GENRE med en array av möjliga felstavningar, för att isåfall ersätta med en korrekt? Inte heller det kommer att vara 100%-igt, men kanske lite snyggare?
Egentligen vill du jämföra det felstavade ordet med varje ord i en godkänd ordlista och på något sätt mäta "avståndet" mellan dem och därefter ersätta det felstavade ordet med det godkända ord som är kortast "avstånd" till. Med "avståndet" menar jag ett mätetal som avgör hur pass lika orden är varandra, där 0 betyder att orden är identiska. Jag är ganska säker på att det finns färdiga algorithmer för sådana mätningar, men jag har aldrig pysslat med det, så jag kan inte knuffa dig i rätt riktning mer än så här.

En enkel och ointelligent lösning som kan ersätta din sed-rad är att göra en case-sats där du listar alla möjliga felstavningar du vill kunna rätta. Men det kommer ju förstås precis som med sed-raden att misslyckas så fort du stöter på en felstavning som du inte har tänkt på i förväg.

Kod: Markera allt

case "$ORD" in
felstavning1 | \
felstavning2 | \
felstavning3 )
   ORD=rättstavning1
;;
felstavning4 )
   ORD=rättstavning2
;;
esac

Re: Ersätta felstavad sträng med rättstavad dito

Postat: 09 okt 2009, 08:28
av dmz
Ja nog var den iallafall snyggare. Efter att ha fyllt på med de mest frekventa felstavningar jag stöter på så lär det också bli mer och mer träffsäkert, tack!