2013-01-19 2 views
2

저는 Python, Perl 등에서 ngram의 다양한 구현을 발견했습니다.하지만 저는 bash 스크립트에서 뭔가를 정말 좋아할 것입니다. "Missing textutils"버전을 훑어 보았지만 ngrams 만 나열하고 주파수로 계산하지는 않습니다. ngrams를 사용하는 것이 상당히 중심적입니다. 난 그냥bash에서 ngram을 생성 할 수 있습니까?

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

누구는 그들이 게시 할 수 있음을 주위에 거짓말 같은이 ...이 같은 빈도와 결과의 기본 목록을 원하는? 감사!

+1

'ngram'의 의미를 자세히 설명해 주시겠습니까? 보다 완벽한 예제는 단순한 샘플 출력보다 낫습니다. –

+0

예. "ngram"은 코퍼스 (텍스트, 일반적으로 일반 텍스트 파일)의 단어 조합입니다. 바이 그램은 두 단어 ("파란 차")이고, 트라이 그램은 세 단어 ("파란 차")입니다. "n"은 단순히 단어의 수가 임의적이라는 것을 의미하지만 실제로는 5 개 이상을 볼 수 없습니다. 일반적으로 ngram을 식별 할 때 텍스트의 빈도를 측정합니다. – user1889034

+0

자세한 내용은 http://en.wikipedia.org/wiki/N-gram을 참조하십시오. 위대한 gui 예제는 antconc입니다. 현재 antconc를 사용하고 있지만 간단히 스크립트를 호출하고 싶습니다. 여기에 제가 언급 한 기존 스크립트가 있습니다 : http://www1.cuni.cz/~obo/textutils/ngrams – user1889034

답변

3

순수한 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로 사용합니다.

+0

위대한 작품. 감사! – user1889034

+0

감사! 'ngram'에'chmod '가 필요합니까? –

+0

유니 코드에서 작동합니까? –

2

예, 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 

참고 : 위는 기능 아닌 스크립트 (아마도이 ​​question 도움이, 또는 어쩌면 더 나은 다른이)입니다. 다음은 스크립트 버전입니다.

#!/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 
+0

게시 해 주셔서 대단히 감사합니다. 그러나 제대로 작동하지 않는 것 같습니다. 사용자가 지정한 예제는 첫 번째 행의 사용 지침과 일치하지 않습니다. 나는 그것을 두 가지 방법으로 시도했지만 아무 일도 일어나지 않습니다. – user1889034

+0

@ user1889034 : 아마 파일에 넣고 파일을 실행하려고했습니다. 그것은 정확히 아무것도하지 않을 것입니다. 그것은 쉘 함수이므로 쉘에서 호출되어야합니다. 대답에 스크립트 버전을 추가했습니다. 사용법 주석이 정확합니다. 'stdin'에서 읽습니다. ' rici

+0

설명해주십시오 : $ {* : $ N} 매우 찾기 어렵습니다! ty – slashdottir

관련 문제