创建自定义单词列表

创建自定义单词列表

我想根据我收集的 pdf 格式的科学论文创建一个自定义的(科学)单词列表,用于拼写检查和 OCR 等目的。使用pdftotext我可以轻松创建一个文本文件,其中包含我的科学领域所需的单词。但是该文件将被污染

  • 非科学专用的单词(也包含在通用词典中)
  • 由于公式转换不当而产生的单词(包括包含特殊字符等的单词)

我想通过要求单个单词具有最小长度、不包含特殊字符并且在列表中出现多次来摆脱后者。其次,我想通过与第二个单词列表进行比较来摆脱前者。我的问题:

对您来说,这听起来是个好计划吗?是否有现有工具可以完成此任务?你会怎么做?

答案1

选择在当前目录下的 PDF 文件中的 /usr/share/dict/words 中至少找到 5 次并且未找到的至少 4 个字符的单词。

 find . -name '*.pdf' -exec pdftotext {} - \; |
   tr -cs '[:alpha:]' '[\n*]' |
   tr '[:upper:]' '[:lower:]' |
   grep -E '.{4}' |
   sort |
   uniq -c |
   awk '$1 > 4 {print $2}' |
   comm -23 - <(tr '[:upper:]' '[:lower:]' < /usr/share/dict/words|sort -u)

您需要一个支持进程替换的 shell(kshzshbash)。

如果您无论如何都要使用perl,您也可以在以下位置完成整个操作perl

find . -name '*.pdf' -exec pdftotext {} - \; |
  perl '-Mopen ":locale"' -nle '
     s/^\S+//;s/\S+$//;y/ \t/ /s;
     next unless length > 40;
     $w{lc$_}++ for /[[:alpha:]]{4,}/g;
     END{open W,"</usr/share/dict/words";
     while(<W>){chomp;delete $w{lc$_}};
     print for grep {$w{$_}>4} keys %w}'

答案2

听起来是一个非常典型的计划。我会使用 shell 脚本来做到这一点。您处理的不是大量文本,因此性能应该足够,并且 shell 脚本很容易编写和重新运行。我的第一个剪辑是这样的脚本:

pdf2text files |
tr -cs '[A-Za-z]' '\n' |  
tr '[A-Z]' '[a-z]' |
awk '{ if (length > 6) {print $1;}}' |
fgrep -v -f /usr/share/groff/current/eign |
sort | 
uniq -c |
awk '{print $2, $1}' |
sort -nr +1 -2 |
head -20

如果长度大于 6,这将为您提供 20 个最常见的单词。

您可以添加步骤、删除步骤、调整参数,看看会得到什么。

fgrep步骤是唯一奇怪的一步,并且要求GNU 特罗夫被安装。文件 /usr/share/groff/current/eign 类似于英语中出现频率最高的 100 个单词。 “-v”标志仅传递未出现在“eign”文件中的单词,因此它使用“eign”作为停止列表。如果您不喜欢 GNU troff 作为常用单词,您可以创建自己的文件并在本fgrep步骤中使用该文件。

相关内容