Code Golf:从文本中快速构建关键字列表,包括实例数

Sam*_*son 12 language-agnostic code-golf text-parsing rosetta-stone

我已经用PHP为自己设计了这个解决方案,但我很好奇它是如何以不同的方式完成的 - 甚至更好.我最感兴趣的两种语言是PHP和Javascript,但我很想知道今天用其他主要语言(主要是C#,Java等)可以多快地完成这项工作.

  1. 仅返回出现次数大于X的单词
  2. 仅返回长度大于Y的单词
  3. 忽略像"和,是,等等"这样的常用术语
  4. 在处理之前随意剥去标点符号(即"约翰"成为"约翰")
  5. 返回集合/数组中的结果

额外信用

  1. 将引用的陈述保持在一起,(即"它们'太好了,显然不是真的'")
    实际的陈述是"太好不可能"

额外信用额度

  1. 您的脚本可以根据它们在一起找到的频率来确定应该保存在一起的单词吗?这是在事先不知道单词的情况下完成的.例:
    *"果蝇在医学研究方面是一件好事.过去对果蝇进行了大量的研究,并取得了许多突破.未来,果蝇将继续研究,但是我们的方法可能会改变."*
    显然,这里的词是"果蝇",这对我们来说很容易找到.你的search'n'scrape脚本也可以确定吗?

源文:http://sampsonresume.com/labs/c.txt

答案格式

  1. 除了操作持续多长时间之外,看到代码,输出的结果会很棒.

lio*_*ori 11

GNU脚本

sed -e 's/ /\n/g' | grep -v '^ *$' | sort | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

结果:

  7 be
  6 to
[...]
  1 2.
  1 -
Run Code Online (Sandbox Code Playgroud)

出现大于X:

sed -e 's/ /\n/g' | grep -v '^ *$' | sort | uniq -c | awk '$1>X'
Run Code Online (Sandbox Code Playgroud)

只返回长度大于Y的单词(在第二个grep中放置Y + 1个点):

sed -e 's/ /\n/g' | grep -v '^ *$' | grep .... | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

忽略像"和,是,等等"这样的常用术语(假设常用术语在文件中被"忽略")

sed -e 's/ /\n/g' | grep -v '^ *$' | grep -vf ignored | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

在处理之前随意删除标点符号(即"John's"变为"John"):

sed -e 's/[,.:"\']//g;s/ /\n/g' | grep -v '^ *$' | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

返回结果集合/数组:它已经像shell的数组:第一列是count,第二列是word.


Bra*_*ert 6

Perl只有43个字符.

perl -MYAML -anE'$_{$_}++for@F;say Dump\%_'
Run Code Online (Sandbox Code Playgroud)

以下是它的一个使用示例:

echo a a a b b c  d e aa | perl -MYAML -anE'$_{$_}++for@F;say Dump \%_'

---
a: 3
aa: 1
b: 2
c: 1
d: 1
e: 1
Run Code Online (Sandbox Code Playgroud)

如果只需要列出小写版本,则需要两个以上的字符.

perl -MYAML -anE'$_{lc$_}++for@F;say Dump\%_'
Run Code Online (Sandbox Code Playgroud)

要使它在指定的文本上工作需要58个字符.

curl http://sampsonresume.com/labs/c.txt |
perl -MYAML -F'\W+' -anE'$_{lc$_}++for@F;END{say Dump\%_}'
Run Code Online (Sandbox Code Playgroud)
real    0m0.679s
user    0m0.304s
sys     0m0.084s

这是扩展了一下的最后一个例子.

#! perl
use 5.010;
use YAML;

while( my $line = <> ){
  for my $elem ( split '\W+', $line ){
    $_{ lc $elem }++
  }
  END{
    say Dump \%_;
  }
}
Run Code Online (Sandbox Code Playgroud)