代码高尔夫:快速构建来自文本的关键字列表,包括实例数量
我已经使用PHP为自己制定了这个解决方案,但我很好奇它是如何以不同方式完成的 - 甚至更好。 我主要感兴趣的两种语言是PHP和Javascript,但是我希望看到今天在任何其他主要语言(主要是C#,Java等)中可以如何快速完成此操作。
额外信贷
真正的陈述是“太好,不真实”
额外的额外信贷
源文本:http://sampsonresume.com/labs/c.txt
答案格式
GNU脚本
sed -e 's/ /n/g' | grep -v '^ *$' | sort | uniq -c | sort -nr
结果:
7 be
6 to
[...]
1 2.
1 -
随着发生率大于X:
sed -e 's/ /n/g' | grep -v '^ *$' | sort | uniq -c | awk '$1>X'
仅返回长度大于Y的字(在第二个grep中放置Y + 1个点):
sed -e 's/ /n/g' | grep -v '^ *$' | grep .... | sort | uniq -c
忽略诸如“和,等等”的常用术语(假设常用术语在文件中被忽略)
sed -e 's/ /n/g' | grep -v '^ *$' | grep -vf ignored | sort | uniq -c
在处理之前随意去掉标点符号(即“John's”变成“John”):
sed -e 's/[,.:"']//g;s/ /n/g' | grep -v '^ *$' | sort | uniq -c
将结果返回到一个集合/数组中:它已经像一个shell的数组:第一列是count,第二个是word。
Perl只有43个字符。
perl -MYAML -anE'$_{$_}++for@F;say Dump%_'
这是一个使用它的例子:
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
如果您只需要列出小写版本,则需要两个以上的字符。
perl -MYAML -anE'$_{lc$_}++for@F;say Dump%_'
要在指定的文本上工作,需要58个字符。
curl http://sampsonresume.com/labs/c.txt |
perl -MYAML -F'W+' -anE'$_{lc$_}++for@F;END{say Dump%_}'
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 %_;
}
}
F# :304个字符
let f =
let bad = Set.of_seq ["and";"is";"the";"of";"are";"by";"it"]
fun length occurrence msg ->
System.Text.RegularExpressions.Regex.Split(msg, @"[^w-']+")
|> Seq.countBy (fun a -> a)
|> Seq.choose (fun (a, b) -> if a.Length > length && b > occurrence && (not <| bad.Contains a) then Some a else None)
链接地址: http://www.djcxy.com/p/18125.html
上一篇: Code Golf: Quickly Build List of Keywords from Text, Including # of Instances
下一篇: Detecting a (naughty or nice) URL or link in a text string