2013-07-24 4 views
1

Une personne réfléchie et intelligente m'a aidé avec un script bash, mais j'ai récemment réalisé que je n'expliquais pas clairement ce que je voulais. J'ai une longue liste de phrases (ngrams) dans un fichier texte. Si une phrase est un fragment d'une autre, seule la plus longue est utile, de sorte que la plus courte doit être supprimée. Le code ci-dessous supprime le plus long. J'espère que changer cela va changer quelques caractères.ngrams (modifier le script bash existant)

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

Alors peut-être qu'il n'était pas si "pensif" après tout (étant donné qu'il ne l'a pas expliqué clairement afin de permettre * vous * ** comprendre **). – devnull

+1

@ user1889034 - Pouvez-vous donner un exemple des données d'entrée? Est-ce que l'un des fragments indésirables peut apparaître au milieu des fragments plus longs désirés? –

Répondre

1

pas en changeant quelques personnages, mais récemment écrit:

#! /bin/bash 

declare -a ngrams 
mapfile -t ngrams < $1 
for ((i=0; i<${#ngrams[@]}; i++)); do 
    for ((j=0; j<${#ngrams[@]}; j++)); do 
     if (( i!=j)) && [[ "${ngrams[j]}" == *"${ngrams[i]}"* ]]; then 
      continue 2 
     fi 
    done 
    echo ${ngrams[i]} >> $2 
done 

Vous pouvez appeler par ngram.sh <infile> <outfile>. E.g .:

> cat txt.in 
foo 
me me me 
kaaz 
bar 
foo bar 
blub 
me 
> ./ngram.sh txt.in txt.out 
> cat txt.out 
me me me 
kaaz 
foo bar 
blub 
+0

Fonctionne magnifiquement. Merci beaucoup! – user1889034

Questions connexes