【问题标题】:Word Frequency without stopwords using egrep使用 egrep 没有停用词的词频
【发布时间】:2018-03-30 10:37:46
【问题描述】:

我想使用终端计算文学文本“text.txt”中的词频,而不计算停用词(来自名为“stopwords.txt”的列表)。

cat text.txt | tr -sc 'A-Za-z' '\n' | tr 'A-Z' 'a-z' | egrep -vwFf stopwords.txt | sort | uniq -c 

为什么这不起作用,正确的脚本应该是什么样的?

注意:输出应该从低频到高频排序!

【问题讨论】:

  • 发布示例输入输出文件
  • 在我的电脑上,您的egrep -vwFf 返回错误:grep: conflicting matchers specified。只需删除 Fflag 即可为我解决此问题。
  • @Aserre 说得好
  • 如果您喜欢管道,请附加| sort -n 以按频率排序。
  • @WalterA 它给了我频率列表,但在停用词内

标签: bash shell terminal grep frequency


【解决方案1】:

您可以考虑使用awk 来使用一个进程而不是效率较低的管道来执行此操作:

$ awk 'BEGIN{RS="[^[:alpha:]]"} 
     /^$/{next}
     {word=tolower($1)}
     FNR==NR {stop[word]; next}
     word in stop {next}
     {wc[word]++}
     END{ for (e in wc) printf "%4d\t%s\n", wc[e], e }
     ' stopwords words 

gawk 仅在这种情况下...)

POSIX awk:

$ awk 'BEGIN{FS="[^[:alpha:]]"} 
     {for (i=1; i<=NF; i++){
         word=tolower($i)
         if (FNR==NR)
             stop[word]
         else if (word in stop || $i~/^$/)
             continue
         else   
             wc[word]++   
        }
     }   
     END{ for (e in wc) printf "%4d\t%s\n", wc[e], e }
     ' stopwords words 

然后您的“管道”可以使用| sort -n 调用sort

【讨论】:

  • 谢谢!那将是一个简单的解决方案;但我想用管道来做......
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2012-12-18
  • 2020-06-24
  • 1970-01-01
  • 2023-03-04
  • 2018-09-02
相关资源
最近更新 更多