Преобразовать подсчеты в относительные вероятности - PullRequest
1 голос
/ 04 февраля 2011

Фон

Создать лексику вероятности на основе CSV-файла слов и подсчетов.Это прелюдия к проблеме сегментации текста, а не домашняя работа.

Задача

При наличии CSV-файла со следующими словами и подсчетами:

aardvark,10
aardwolf,9
armadillo,9
platypus,5
zebra,1

Создатьфайл с вероятностями относительно самого большого числа в файле:

aardvark,1
aardwolf,0.9
armadillo,0.9
platypus,0.5
zebra,0.1

Где, например, aardvark,1 рассчитывается как aardvark,10/10, а platypus,0.5 вычисляется как platypus,5/10.

Вопрос

Какой самый эффективный способ реализации сценария оболочки для создания файла относительных вероятностей?

Ограничения

  • Ни слова, ни цифрыв любом порядке.
  • Нет основных языков программирования (таких как Perl, Ruby, Python, Java, C, Fortran или Cobol).
  • Стандартные инструменты Unix, такие как awk, sed или sort приветствуются.
  • Все вероятности должны быть относительно наибольшей вероятности в файле.
  • Слова уникальны, числа не являются.
  • Подсчеты являются натуральными числами.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011
awk 'BEGIN{max=0;OFS=FS=","}  $NF>max{max=$NF}NR>FNR {print $1,($2/max) }' file file
2 голосов
/ 04 февраля 2011

Нет необходимости читать файл дважды:

awk 'BEGIN {OFS = FS = ","} {a[$1] = $2} $2 > max {max=$2} END {for (w in a) print w, a[w]/max}' inputfile

Если вам нужен вывод, отсортированный по слову:

awk ... | sort

или

awk 'BEGIN {OFS = FS = ","} {a[$1] = $2; ind[j++] = $1} $2 > max {max=$2} END {n = asort(ind); for (i=1; i<=n; i++) print ind[i], a[ind[i]]/max}' inputfile

Если вам нужен результат, отсортированный по вероятности:

awk ... | sort -t, -k2,2n -k1,1
1 голос
/ 04 февраля 2011

Это не является ошибкой, но что-то вроде этого должно работать:

#!/bin/bash

INPUT=data.cvs
OUTPUT=tally.cvs
DIGITS=1

OLDIFS=$IFS
IFS=,

maxval=0  # Assuming all $val are positive

while read name val
do
    if (( val > maxval )); then maxval=$val; fi
done < $INPUT

# Make sure $OUTPUT doesn't exist

touch $OUTPUT

while read name val
do
    tally=`echo "scale=$DIGITS; result=$val/$maxval; if (0 <= result && result < 1) { print "0" }; print result" | bc`
    echo "$name,$tally" >> $OUTPUT
done < $INPUT

IFS=$OLDIFS

Заимствовано из этот вопрос и различные варианты поиска в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...