Intereting Posts

Сделать статистику биграмм

У меня есть текстовый файл, в котором есть одно слово в каждой строке, и я хотел бы делать bigrams и подсчитывать повторы (статистику) каждого биграма.

Мой подход:

cat TEXTEN1.txt | tr '*\n' '*? *\n' 

Я хотел бы сделать два столбца, но это решение выходит из строя.

paste -d' ' - - < TEXTEN1.txt

Чтобы получить счет изготовленных биграмм:

paste -d' ' - - < TEXTEN1.txt | sort | uniq -c

Однако этот метод будет исключать половину биграмм. Например, если ваш входной файл:

 alpha beta gamma alpha beta gamma 

Биграммы будут включать строки 1-2, линии 3-4 и строки 5-6, но не строки 2-3 и строки 3-4.

Один из способов, по которому вы могли бы решить это, – создать копию входного файла и добавить неглавное в начало (например, «#»), а затем отфильтровать результат, содержащий не-слово:

cat <(paste -d' ' - - < TEXTEN1.txt; paste -d' ' - - < TEXTEN2.txt) | sort | uniq -c | grep -v #

В системах gnu вы можете запустить:

 paste <(head -n -1 infile) <(tail -n +2 infile) | sort | uniq -c 

Портабельно:

 sed -e '1!{$!p' -e '}' infile | paste -d' ' - - | sort | uniq -c 

или

 awk 'NR>1{i=t" "$0; z[i]++};{t=$0}END{for (i in z){print z[i], i}}' infile 

Если вы хотите объединить слова на каждой из двух последовательных строк, чтобы сделать bigram, вы можете сделать это так:

 cat TEXTEN1.txt|sed 'N; s/\n/ /'|sort|uniq -c 

это будет сочетать последовательные пары линий, такие как 1-2, 3-4, 5-6 и т. д.

Если вы хотите объединить каждую +1 линию (то есть 1-2, 2-3, 3-4 …), вы можете сделать это так

 cat TEXTEN1.txt|sed -n ':a N;s/\n/ /p;s/\w* //;ta'|sort|uniq -c 

или использовать (несколько более элегантную) комбинацию sed + paste от @don_crissti