2

这是我的问题。我是一名西班牙语翻译,我有一个很长的西班牙语-英语词汇表文件——50K 条目。此外,我有一个超过 1K 条目的停用词词汇表。我想从我计划翻译的文本中删除这些条目。因此,我构建了一个 sed 脚本,该脚本又从词汇表中构建了另外两个 sed 脚本,它们进行剥离,只留下未翻译的文本(因此我不必两次解决相同的问题)。这很好用,但问题是长文本需要很长时间,有时超过 15 分钟。这只是不可避免的,还是有更有效的方法来做到这一点?

这是主要脚本:

#!/bin/sh
before="$(date +%s)"

#wordstxt=$(wc -w < $1)
#mintime=$(expr "$wordstxt / 200" |bc -l)
#maxtime=$(expr "$wordstxt / 175" |bc -l)
#echo "Estimated time to process: between $mintime and $maxtime seconds."
sed '
s/\,/\n/g           # strip all commas
s/\?/\n/g       # strip question marks
s/\*/\n/g       # strip asterisks
s/\!/\n/g           # strip exclamation marks
s/:/\n/g            # strip colons
s/\-/\n/g           # strip hyphens
s/\./\n/g           # strip periods
s/«/\n/g            # strip left Euro-quotes
s/»/\n/g            # strip right Euro-quotes
s/”/\n/g            # strip slanted US quotes
s/\"/\n/g       # strip left quotes
s/(/\n/g            # strip left paren
s/)/\n/g            # strip right paren
s/\[/\n/g           # strip left bracket
s/\]/\n/g           # strip right bracket
s/¿/\n/g            # "¿"
s/—/\n/g        # m-dash
s/\ –\ /\n/g        # n-dash
s/…/\n/g        # strip elipsis as a single character, not three periods
s/;/\n/g            # strip semicolon
s/[0-9]/\n/g        # strip out all numbers, replace with returns
' $1 > $1.z.tmp
#echo "Punctuation eliminated."

#cp ../../Spanish\ to\ English\ projects/glossary/stoplist.txt .
sed '
s/^\ //g        # strip leading spaces
s/\ $//         # strip trailing spaces
/^$/d           # delete blank lines
s/\./\n/g       # strip periods
s/\ /\\ /g      # make spaces into literals
s/^/s\//        # begins the substitution
s/$/\/\\n\/g/   # concludes the substitution

1 s/^/#!\ \/bin\/sed\ \-f\n\ns\/\[0\-9\]\/\/g\ns\/\\\ \\\ \/\\\ \/g\ns\/\\\.\\\ \/\\n\/g\n\n/

' stoplist.txt > stoplist.sed
chmod +x stoplist.sed
echo "Eliminating stopwords."
./stoplist.sed $1.z.tmp > $1.0.tmp

sed 's/\([A-Za-z\ ]*\t\).*/\1/' SpanishGlossary.utf8 > tempgloss.2.txt
#echo "Target phrases stripped."

sort -u tempgloss.2.txt > tempgloss.3.txt

awk '{ print length(), $0 | "sort -rn" }' tempgloss.3.txt > tempgloss.4.txt
#echo "List ordered by length."

#echo "Now creating new sed script." # THIS AFFECTS THE SED SCRIPT, NOT THE OUTPUT FILE.

sed '
s/[0-9]//g      # strip out all numbers
s/^\ //g        # strip leading spaces -- all lines have them due to the sort
/^$/d           # delete blank lines
s/\//\\\//g     # make text slashes into literals
s/"/\n/g            # strip quotes
s/\t//g         # strip tabs
s/\./\n/g       # strip periods
s/'\''/\\'\''/g     # make straight apostrophes into literals
s/'\’'/\\'\’'/g     # make curly apostrophes into literals
s/\ /\\ /g      # make spaces into literals
/^.\{0,5\}$/d       # delete lines with less than five characters
s/^/s\/\\b/     # begins the substitution
s/$/\\b\/\\n\/g/    # concludes the substitution

1 s/^/#!\ \/bin\/sed\ \-f\n\ns\/\[0\-9\]\/\/g\ns\/\\\ \\\ \/\\\ \/g\ns\/\\\.\\\ \/\\n\/g\n\n/

' tempgloss.4.txt > glossy.sed

#echo "glossy.sed created."
chmod +x glossy.sed

echo "Eliminating existing entries. This may take a while."
./glossy.sed $1.0.tmp > $1.1.tmp

echo "Now cleaning up lines."
sed -e '
s/\ $//         # strip trailing spaces
s/^\ *//g       # strip any and all leading spaces
s/\ el$//g      # strip "el" from the end
s/\ la$//g      # strip "la" from the end
s/\ los//g      # strip "los" from the end
s/\ las//g      # strip "las" from the end
s/\ o$//g       # strip "o" from the end
s/\ y$//g       # strip "y" from the end
s/\ $//         # strip trailing spaces (yes, again)
' $1.1.tmp > $1.2.tmp

echo "Creating ngrams."
./ngrams 5 < $1.2.tmp > $1.3.tmp 2> /dev/null

linecount="$(wc -l < $1.3.tmp)"
#echo $linecount "lines."
if [ "$linecount" -gt "1000" ]
then
    echo "Eliminating single instances."
    sed '/^1\t/d' $1.3.tmp > $1.4.tmp
else
    echo "Fewer than 1000 entries, so keeping all."
    cp $1.3.tmp $1.4.tmp
fi

sed -e '
s/[0-9]//g      # strip out all numbers
s/^\t//g            # strip leading tab
s/^\ *//g       # strip any and all leading spaces
/^.\{0,7\}$/d       # delete lines with less than six characters
s/\ $//         # strip trailing spaces (yes, again)
#s/$/\t/            # add in the tab
' $1.4.tmp > $1.csv

echo "Looking for duplicates."
sh ./dedupe $1.csv

wordstxt=$(wc -w < $1)
#echo $wordstxt
wordslist=$(wc -w < $1.csv)
#echo $wordslist
wordspercent=$(echo "scale=4; $wordslist / $wordstxt" |bc -l)
wordspercentage=$(echo "$wordspercent * 100" |bc -l)


after="$(date +%s)"
elapsed_seconds="$(expr $after - $before)"
rate=$(echo "scale=3; $wordstxt / $elapsed_seconds" |bc -l)
echo "Created "$1.csv", with $wordspercentage% left, in" $elapsed_seconds "seconds." #, for an effective rate of" $rate "words per second."

rm tempgloss.*.txt
rm *.tmp
rm glossy.sed
4

2 回答 2

0

您可以将其中的许多组合起来,以提高速度

s/[\,\?\*\!:\-\.]/\n/g
于 2013-03-02T04:12:07.713 回答
0

在 awk 中重写脚本,它将在几秒钟而不是几分钟内运行,并且更简洁、更简单、更清晰。sed 是在单行上进行简单替换的出色工具。对于其他任何事情,只需使用 awk。

于 2013-03-02T13:51:27.410 回答