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

これが純粋なbashの実装です。連想配列をサポートするbash>=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 に答える
4

はい、ngram は 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 に答える