代码高尔夫:快速构建来自文本的关键字列表,包括实例数量

我已经使用PHP为自己制定了这个解决方案,但我很好奇它是如何以不同方式完成的 - 甚至更好。 我主要感兴趣的两种语言是PHP和Javascript,但是我希望看到今天在任何其他主要语言(主要是C#,Java等)中可以如何快速完成此操作。

  • 仅返回发生率大于X的单词
  • 只返回长度大于Y的单词
  • 忽略像“和,是,等等”的常用术语
  • 在处理之前随意去掉标点符号(即“John's”变成“John”)
  • 将结果返回到一个集合/数组中
  • 额外信贷

  • 将引用的语句保持在一起(即“显然,它们'太好了,不可能')
    真正的陈述是“太好,不真实”
  • 额外的额外信贷

  • 你的脚本可以根据他们在一起被发现的频率确定应该保持在一起的单词吗? 这是在事先不知道单词的情况下完成的。 例如:*“果蝇在医学研究方面是一件好事,过去对果蝇进行了大量的研究,并导致了许​​多突破,未来,果蝇将继续研究,但我们的方法可能会改变。“*显然这里的词是”果蝇“,这对我们来说很容易找到。 你的search'n'scrape脚本也能确定这一点吗?
  • 源文本: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