包装hunspell有效地阻止了大量的单词?

时间:2015-10-27 20:54:43

标签: bash stemming hunspell

我已经编写了一个用于阻止英语单词的脚本,它做得不错,但是当我在大文件上使用它时需要永远,这些文件有超过1000个单词,每行一个。有办法加快速度吗?也许完全不同的方法?不同的编程语言?不同的词干?

file=$1
while read -r a
do
b="$(echo "$a" | hunspell -s -d en_US | wc -l)"
if [[ "$b" -eq 2 ]]
 then
   g="$(echo "$a" | hunspell -s -d en_US | wc -w)"
   if [[ "$g" -eq 1 ]]
    then
     echo "$a" | hunspell -s -d en_US | awk 'FNR==1 {print $1}'
    else
     echo "$a" | hunspell -s -d en_US | awk 'FNR==1 {print $2}'
   fi
 else
   if [[ "$a" == *ing ]] || [[ "$a" == *ed ]]
     then
       echo "$a" | hunspell -s -d en_US | awk 'FNR==2 {print $2}'
     else
       echo "$a" | hunspell -s -d en_US | awk 'FNR==1 {print $1}'
   fi
fi
done < "$file" 

这是一个例子。

输入文件

cliché
womb
range
strain
fiddle
coup
earnest
touched
gave
dazzling
blindfolded
stagger
buying
insignia

输出

cliché
womb
range
strain
fiddle
coup
earnest
touch
give
dazzle
blindfold
stagger
buy
insignia

工作原理

如果您运行hunspell -s -d en_US word,它会根据单词给您不同的结果。选项和要采取的措施如下:

  • 一行一个字(打印该字)
  • 一行有两个单词(打印第二个单词)
  • 两行两个字;以“ing”或“ed”结尾(在第二行打印第二个字)
  • 两行两个字;不以“ing”或“ed”结尾(在第一行打印第一个单词)

2 个答案:

答案 0 :(得分:4)

以下内容会发出完全相同的输出(但是将gave更改为give,我的hunspell似乎没有在其字典中显示 - 而且远远快得多:< / p>

last_word=; stems=( )
while read -r word stem _; do
  if [[ $word ]]; then
    last_word=$word
    [[ $stem ]] && stems+=( "$stem" )
  else
    if (( ${#stems[@]} == 0 )); then
      printf '%s\n' "$last_word"        # no stems available; print input word
    elif (( ${#stems[@]} == 1 )); then
      printf '%s\n' "${stems[0]}"       # found one stem; print it.
    else
      case $last_word in
        *ing|*ed) printf '%s\n' "${stems[1]}" ;; # "ing" or "ed": print the 2nd stem
        *)        printf '%s\n' "${stems[0]}" ;; # otherwise: print the 1st stem
      esac
    fi
    stems=( )
  fi
done < <(hunspell -s -d en_US <"$1")

请注意,对于整个文件只运行一次hunspell ,而不是每个单词运行一次;它一遍又一遍地重新启动hunspell,与bash没有任何关系,你的脚本花费了所有时间。

答案 1 :(得分:-2)

您可能还想考虑案例 如果是案例变量 字1;响应 ESAC

检查手册页以获取正确的语法。它在* nix版本中略有变化