3

我在 Python、Perl 等中找到了各种 ngram 实现,但我真的很喜欢 bash 脚本中的一些东西。我遇到了“Missing textutils”版本,但它只列出了 ngram,它没有按频率计算它们,这对于使用 ngram 来说是相当重要的——或者至少对我的使用来说是这样。我只想要一个基本的结果列表及其频率,就像这样......

17 blue car
14 red car
5  and the
2  brown monkey
1  orange car

任何人都可以发布类似的东西吗?谢谢!

4

2 回答 2

4

是的,ngrams 可以在 bash 中实现。

# Usage: ngrams N < FILE
ngrams () { 
  local N=$1
  local line
  set --
  while read line; do
    set -- $* $line
    while [[ -n ${*:$N} ]]; do
      echo ${*:1:$N}
      shift
    done
  done |
  sort | uniq -c
}

$ ngrams 2
Here is some text, and here is
some more text, and here is yet
some more text
  1 Here is
  2 and here
  2 here is
  2 is some
  1 is yet
  1 more text
  1 more text,
  2 some more
  1 some text,
  2 text, and
  1 yet some

注意:上面是一个函数,而不是一个脚本(也许这个问题有帮助,或者也许还有另一个更好的问题)。这是脚本版本:

#!/bin/bash
# Usage: ngrams N < FILE
N=$1
set --
while read line; do
  set -- $* $line
  while [[ -n ${*:$N} ]]; do
    echo ${*:1:$N}
    shift
  done
done |
sort | uniq -c
于 2013-01-19T05:50:03.797 回答
4

这是一个纯 bash 实现。您需要使用支持关联数组的 ba​​sh >= 4.2 版本。

#!/usr/bin/env bash

((n=${1:-0})) || exit 1

declare -A ngrams

while read -ra line; do
        for ((i = 0; i < ${#line[@]}; i++)); do
                ((ngrams[${line[@]:i:n}]++))
        done
done 

for i in "${!ngrams[@]}"; do
        printf '%d\t%s\n' "${ngrams[$i]}" "$i"
done

另存为ngram并用作ngram 2 < file.

于 2013-01-19T16:42:11.700 回答