首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较一组单词的出现情况

比较一组单词的出现情况
EN

Stack Overflow用户
提问于 2018-03-15 04:49:15
回答 2查看 75关注 0票数 1

我有一个包含随机单词的文本文件。我想找出哪些单词作为一对出现频率最高(‘嗨,你好’或‘好,再见’)。

Simple.txt

代码语言:javascript
运行
复制
hi there. hello this a dummy file. hello world. you did good job. bye for now.

我已经编写了这个命令来获取每个单词的计数(嗨,你好,好,再见)。

代码语言:javascript
运行
复制
cat simple.txt| tr -cs '[:alnum:]' '[\n*]' | sort | uniq -c|grep -E -i  "\<hi\>|\<hello\>|\<good\>|\<bye\>"

这给了我每个单词在文件中的出现次数(它出现的次数),但现在如何改进它并获得直接输出,如"Hi/hello是出现次数最多的对“

EN

回答 2

Stack Overflow用户

发布于 2018-03-15 05:30:18

为了让它更有趣,让我们考虑一下这个测试文件:

代码语言:javascript
运行
复制
$ cat >file.txt
You say hello.  I say good bye.  good bye. good bye.

要获取所有单词对的计数,请执行以下操作:

代码语言:javascript
运行
复制
$ awk -v RS='[[:space:][:punct:]]+' 'NR>1{a[last","$0]++} {last=$0} END{for (pair in a) print a[pair], pair}' file.txt
3 good,bye
1 say,good
2 bye,good
1 I,say
1 You,say
1 hello,I
1 say,hello

要获得计数最高的单个对,我们需要排序:

代码语言:javascript
运行
复制
$ awk -v RS='[[:space:][:punct:]]+' 'NR>1{a[last","$0]++} {last=$0} END{for (pair in a) print a[pair], pair}' file.txt | sort -nr | head -1
3 good,bye

它是如何工作的

  • -v RS='[[:space:][:punct:]]+'

这告诉awk使用空格或标点符号的任意组合作为记录分隔符。这意味着每个单词都会变成一个record.

  • NR>1{a[last","$0]++}

对于第一个单词之后的每个单词,为前一个和当前work.

  • last=$0的组合递增关联数组a中的计数

将当前单词保存在变量last.

  • END{for (pair in a) print a[pair], pair}

在读取完输入之后,打印出每个pair.

  • sort -nr的结果

以反转(最高数字优先) order.

  • head -1对输出进行数字排序

选择第一行(为我们提供计数最高的行)。

多行版本

对于那些喜欢将代码分散到多行的人:

代码语言:javascript
运行
复制
awk -v RS='[[:space:][:punct:]]+' '
    NR>1 {
        a[last","$0]++
    }

    {
        last=$0
    }

    END {
        for (pair in a)
            print a[pair], pair
    }' file.txt | sort -nr | head -1
票数 3
EN

Stack Overflow用户

发布于 2018-03-15 05:32:50

一些简洁的perl:

代码语言:javascript
运行
复制
perl -MList::Util=max,sum0 -slne '
    for $word (m/(\w+)/g) {$count{$word}++}
 } END {
    $pair{$_} = sum0 @count{+split} for ($a, $b);
    $max = max values %pair;
    print "$max => ", {reverse %pair}->{$max};
' -- -a="hi hello" -b="good bye" simple.txt
代码语言:javascript
运行
复制
3 => hi hello
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49287384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档