![在列表中列出最常用单词的最简单方法是什么?](https://linux22.com/image/28126/%E5%9C%A8%E5%88%97%E8%A1%A8%E4%B8%AD%E5%88%97%E5%87%BA%E6%9C%80%E5%B8%B8%E7%94%A8%E5%8D%95%E8%AF%8D%E7%9A%84%E6%9C%80%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
假设我有一堆文本文件,其中包含小说、非小说、报纸文章等(给定语言的文本的随机示例。)
我想要给定单词的频率列表,首先是最常见的单词。
我可以编写一些 C 代码来执行此操作,但如果有更快的方法来执行此操作,我想知道。 (当我说更快时,我指的是编码时间,而不是运行时间。)
答案1
为了更快的编码时间,这是我现在成功尝试的:
printf '%s\n' $(cat *.txt) | sort | uniq -c | sort -gr | less
答案2
用 C 语言编写它很可能具有快速的运行时间,但编写起来需要更长的时间。一个好的折衷方案可能是使用 awk:
计数.awk
FNR == NR { pat[$1] = 1; next }
{
for(p in pat)
if(index($0, p))
pat[p]++
}
END {
for(p in pat)
print pat[p]-1, p
}
这将首先读取单词列表(每行一个单词),然后计算在其余输入中找到的匹配项。像这样运行它:
cat *.txt | awk -f tally.awk wordlist - | sort -nr
上面的代码也将匹配子字符串,如果您只想匹配整个单词,请将该index
行替换为:
if(match($0, "\\<" p "\\>"))
答案3
你可以这样做(使用 GNU grep):
grep -hEo "[[:alnum:]_'-]+" ./*.txt | sort | uniq -c | sort -rn
将上面的内容更改[:alnum:]_'-
为单词成分。