파일에서 가장 일반적인 문자/문자 조합 찾기

파일에서 가장 일반적인 문자/문자 조합 찾기

파일에서 가장 일반적인 문자/문자 조합 찾기

단순히 반복되는 단어를 찾는 대신(a la:파일에서 n개의 가장 일반적인 단어 찾기), 반복되는 문자 조합 문자열을 모두 나열해야 합니다...

파일에서 가장 자주 발생하는 모든 길이의 문자/문자 조합을 기록하고 싶으십니까?

예시 목록:

Stack
Exchange
Internet
Web
Question
Find
Frequent
Words
Combination
Letters
....

결과적으로 반복되는 문자 조합:

[a,b,c,d,e,f,g,i,k,l,m,n,o,q,r,s,t,u,w,x]
in
ue
st
tion
ion
on
ti
et
te
ter
...

발생 횟수에 따라 결과를 나열할 수 있음 = 보너스 :)

답변1

반복되는 모노그램 문자열을 모두 나열해야 합니다...

...그래서 스크립트에서 1글자부터 전체 줄 길이(샘플 데이터가 줄당 1단어를 제공하므로 단어의 길이)까지 가능한 모든 길이를 살펴보게 했습니다...

문서 ssf.mawk:

#!/usr/bin/mawk -f
BEGIN {
        FS=""
}
{
        _=tolower($0)
        for(i=1;i<=NF;i++)
                for(j=i;j<=NF;j++)
                        print substr(_,i,j-i+1) | "sort|uniq -c|sort -n"
}

샘플 입력을 사용하여 실행 출력을 줄입니다.

$ printf '%s\n' Stack Exchange Internet Web Question Find Frequent Words Combination Letters .... | ./ssf.mawk
      1 ....
      1 ac
      1 ack
      1 an
      1 ang

(((여기서 많은 줄이 생략되었습니다)))

      4 s
      5 i
      8 n
      8 t
     10 e

mawk-1.3.3나는 이것을 Debian8에서 테스트했습니다 gawk-4.1.1.

답변2

최소한 두 개(가장 작은 N변경 사항에 대해)가 있다고 가정하고 대소문자를 무시하고 한 줄에 어떤 조합이든 다음과 같이 수행할 수 있습니다.{2,$l}{N,$l}

% < examplelist 
Stack
Exchange
Internet
Web
Question
Find
Frequent
Words
Combination
Letters
% < examplelist perl -nlE '$_=lc; $l=length; next if $l < 2; m/(.{2,$l})(?{ $freq{$1}++ })^/; END { say "$freq{$_} $_" for keys %freq }' | sort -rg | head -4
3 in
2 ue
2 tion
2 tio

답변3

이것은 발생순으로 출력을 정렬하는 Perl 스크립트입니다. 최소 문자열 길이는 구성 가능하며, 진행 상황을 확인할 수 있는 디버깅 옵션이 포함되어 있습니다.

#!/usr/bin/perl
# Usage: perl script_file input_file

use strict;
my $min_str_len = 2;
my $debug = 0;

my %uniq_substrings;

while(<>)
{
    chomp;
    my $s = lc $_; # assign to $s for clearity

    printf STDERR qq|#- String: [%s]\n|, $s if $debug;
    my $line_len = length($s);
    for my $len ($min_str_len .. $line_len)
    {
        printf STDERR qq|# Length: %u\n|, $len if $debug;
        # break string into characters
        my @c  = split(//,$s);
        # iterate over list while large enough to provide strings of $len characters
        while(@c>=$len)
        {
            my $substring = join('', @c[0..$len-1]);
            my $curr_count = ++$uniq_substrings{$substring};
            printf STDERR qq|%s (%s)\n|, $substring, $curr_count if $debug;
            shift @c;
        }
    }
}

sub mysort
{
    # sort by count, subsort by alphabetic
    my $retval =
        ($uniq_substrings{$b} <=> $uniq_substrings{$a})
        || ($a cmp $b);
    return $retval;
}

for my $str (sort(mysort keys %uniq_substrings))
{
    printf qq|%s = %u\n|, $str, $uniq_substrings{$str};
}

답변4

스크립트:

MIN=2
MAX=5
while read A; do
    [ ${MAX} -lt ${#A} ] && max=${MAX} || max=${#A}
    for LEN in $(seq ${MIN} ${max}); do
        for k in $(seq 0 $((${#A}-${LEN}))); do
            echo "${A:$k:${LEN}}"
        done
    done
done <<< "$(cat file1|tr 'A-Z' 'a-z')" |sort|uniq -c|sort -k1,7rn -k9

몇 가지 설명이 있습니다.

# define minimal length of letters combinations
MIN=2
# define maximal length of letters combinations
MAX=5
# take line by line
while read A; do
    # determine max length of letters combination for this line
    # because it is shorter than MAX above if length of the line is shorter
    [ ${MAX} -lt ${#A} ] && max=${MAX} || max=${#A}
    # in cycle take one by one possible lengths of letters combination for line
    for LEN in $(seq ${MIN} ${max}); do
        # in cycle take all possible letters combination for length LEN for line
        for k in $(seq 0 $((${#A}-${LEN}))); do
            # print a letter combination
            echo "${A:$k:${LEN}}"
        done
    done
done <<< "$(cat file1|tr 'A-Z' 'a-z')" |sort|uniq -c|sort -k1,7rn -k9
# the data are taken from file "file1" and converted to lowercase,
# the data are sorted, unique lines counted,
# after results sorted according to string numerical values for numbers
# and strings with the same numbers sorted in alphabetical order

매개변수 MIN=2 및 MAX=5인 경우 처음 30줄이 출력됩니다(총 출력은 152줄입니다).

      3 in
      2 er
      2 et
      2 io
      2 ion
      2 nt
      2 on
      2 qu
      2 que
      2 st
      2 te
      2 ter
      2 ti
      2 tio
      2 tion
      2 ue
      1 ac
      1 ack
      1 an
      1 ang
      1 ange
      1 at
      1 ati
      1 atio
      1 ation
      1 bi
      1 bin
      1 bina
      1 binat
      1 ch
      ...

매개변수 MIN=1 및 MAX=3인 경우 처음 20줄이 출력됩니다(총 출력은 109줄입니다).

     10 e
      8 n
      8 t
      5 i
      4 o
      4 r
      4 s
      3 a
      3 c
      3 in
      2 b
      2 d
      2 er
      2 et
      2 f
      2 io
      2 ion
      2 nt
      2 on
      2 q
      ...

관련 정보