linux - 프로그램 - 파이썬 한글 단어 빈도수




특정 용어의 단어 빈도 결정 (5)

나는 컴퓨터 과학이 아닌 학생으로 다수의 텍스트에서 특정 용어의 빈도를 결정한 다음 시간 경과에 따라 이러한 빈도를 플로팅하여 변화와 추세를 파악하는 것을 말합니다. 주어진 텍스트 파일에 대한 단어 빈도를 결정하는 방법을 알아 냈지만 많은 수의 파일 (> 100)을 다루었으며 일관성을 위해 빈도 수에 포함 된 단어를 제한하려고합니다. 특정 용어 집합 (일종의 "중지 목록"과 반대)

이것은 매우 간단하게 유지되어야합니다. 결국 내가 처리해야하는 각 텍스트 파일의 특정 단어에 대한 빈도가 있어야하는데, 스프레드 시트 형식 (탭 구분 파일)을 사용하면 데이터를 사용하여 그래프와 시각화를 만들 수 있습니다.

나는 일상적으로 리눅스를 사용하고, 명령 행을 사용하는 것이 편하며, 오픈 소스 솔루션 (또는 WINE으로 실행할 수있는 것)을 좋아할 것이다. 그러나 그것은 요구 사항은 아닙니다.

이 문제를 해결하는 두 가지 방법이 있습니다.

  1. 사전 정의 된 목록을 제외하고 텍스트 파일의 모든 단어를 스트립 아웃 한 다음 거기에서 빈도 수를 계산하거나 다음을 수행하십시오.
  2. 사전 정의 된 목록의 용어 만 사용하여 빈도 계산 방법을 찾으십시오.

어떤 아이디어?


나는 다음과 같은 스크립트를 사용하여 이런 일을한다 (bash 구문으로) :

for file in *.txt
do 
  sed -r 's/([^ ]+) +/\1\n/g' "$file" \
  | grep -F -f 'go-words' \
  | sort | uniq -c > "${file}.frq"
done

개별 단어를 구분하는 데 사용하는 정규식을 조정할 수 있습니다. 이 예제에서는 공백을 구분 기호로 취급합니다. grep의 -f 인수는 관심있는 단어가 한 줄에 하나씩 들어있는 파일입니다.


나는 새로운 파일이 시간이 지남에 따라 도입된다고 추측하고 있습니다.

나는 당신의 최선의 방법이 당신의 선택 2와 같은 것일 것이라고 생각합니다. 당신이하고 싶은 것은 키워드의 출현 횟수를 세는 것뿐입니다. 각 파일을 한 번씩 읽으면 목록에있는 단어가 나타날 때마다 계산됩니다. 개인적으로 나는 루비에서 그것을 할 것이지만, 펄이나 파이썬 같은 언어는 또한이 작업을 매우 간단하게 만들 것입니다. 예를 들어 키워드로 키를 사용하는 연관 배열을 사용하고 값으로 발생 횟수를 사용할 수 있습니다. (그러나 발생에 대한 자세한 정보를 저장해야하는 경우 이는 너무 단순 할 수 있습니다.)

파일 당 정보를 저장 하시겠습니까, 아니면 전체 데이터 세트를 저장 하시겠습니까? 나는 그것이 통합하기가 그렇게 어렵지 않을 것이라고 생각한다.

일단 데이터를 얻은 후에는 어떻게해야할지 모르겠습니다. 스프레드 시트로 내보내는 것이 좋을 것입니다. 또는 장기간에 걸쳐 데이터를 멋지게 표시하는 추가 코드를 작성하는 것이 더 쉬울 수도 있습니다. 데이터로 무엇을하고 싶은가에 달려 있습니다 (예 : 연습 마지막에 몇 개의 차트 만 작성하여 보고서에 넣으려면 CSV로 내보내기가 가장 적합 할 수 있습니다. 반면에 생성하려는 경우 매일 새로운 데이터 세트를 1 년 동안 작성하면 자동으로이를 수행 할 수있는 도구를 구축하는 것이 가장 좋은 아이디어입니다.

편집 : 나는 당신이 역사를 공부하고 있기 때문에, 당신의 문서가 시간이 지남에 따라 변화하지 않고, 오히려 이미 일어난 일련의 변화를 반영 할 것이라는 것을 알아 냈습니다. 죄송합니다. 어쨌든, 위에서 말한 거의 모든 것들이 여전히 적용된다고 생각하지만, CSV로 내보내거나 자동화 된 디스플레이가 아닌 것을 가지고 갈 것이라고 기대합니다.

즐거운 프로젝트 인 것처럼 들리 - 행운을 빈다.


파일에 "grep"을 사용하여 키워드를 포함하는 모든 행을 찾습니다. (grep -f는 검색 할 단어의 입력 파일을 지정하는 데 사용할 수 있습니다 (grep의 출력을 파일로 파이프). 그러면 단어의 인스턴스를 포함하는 행의 목록을 얻을 수 있습니다. 그런 다음 "sed"를 수행하십시오 단어 분리 기호 (대다수의 공백 문자)를 개행 문자로 대체하여 별도의 단어 파일 (한 줄에 한 단어 씩)을 제공하십시오. 이제는 동일한 단어 목록을 사용하여 grep을 다시 실행하십시오. 지정된 단어가있는 행의 수, 즉 원본 파일에있는 단어의 출현 횟수).

two-pass 방법은 단순히 "sed"를 쉽게 만듭니다. 첫 번째 grep은 많은 줄을 제거해야합니다.

기본 Linux 명령 줄 명령에서이 모든 작업을 수행 할 수 있습니다. 일단 프로세스에 익숙해지면 모든 것을 쉘 스크립트에 넣을 수 있습니다.


나는 두 번째 아이디어와 함께 갈 것입니다. 다음은 제공된 첫 번째 파일에서 단어 목록을 읽고 탭으로 구분 된 형식으로 제공된 두 번째 파일에서 목록의 각 단어 수를 인쇄하는 간단한 Perl 프로그램입니다. 첫 번째 파일의 단어 목록은 한 줄에 하나씩 제공되어야합니다.

#!/usr/bin/perl

use strict;
use warnings;

my $word_list_file = shift;
my $process_file = shift;

my %word_counts;

# Open the word list file, read a line at a time, remove the newline,
# add it to the hash of words to track, initialize the count to zero
open(WORDS, $word_list_file) or die "Failed to open list file: $!\n";
while (<WORDS>) {
  chomp;
  # Store words in lowercase for case-insensitive match
  $word_counts{lc($_)} = 0;
}
close(WORDS);

# Read the text file one line at a time, break the text up into words
# based on word boundaries (\b), iterate through each word incrementing
# the word count in the word hash if the word is in the hash
open(FILE, $process_file) or die "Failed to open process file: $!\n";

while (<FILE>) {
  chomp;
  while ( /-$/ ) {
    # If the line ends in a hyphen, remove the hyphen and
    # continue reading lines until we find one that doesn't
    chop;
    my $next_line = <FILE>;
    defined($next_line) ? $_ .= $next_line : last;
  }

  my @words = split /\b/, lc; # Split the lower-cased version of the string
  foreach my $word (@words) {
    $word_counts{$word}++ if exists $word_counts{$word};
  }
}
close(FILE);

# Print each word in the hash in alphabetical order along with the
# number of time encountered, delimited by tabs (\t)
foreach my $word (sort keys %word_counts)
{
  print "$word\t$word_counts{$word}\n"
}

words.txt 파일에 다음이 포함 된 경우 :

linux
frequencies
science
words

text.txt 파일에는 게시물의 텍스트 인 다음 명령이 들어 있습니다.

perl analyze.pl words.txt text.txt

인쇄 할 것입니다 :

frequencies     3
linux   1
science 1
words   3

\ b를 사용하여 단어 경계를 깨는 것은 모든 경우에 원하는 방식으로 작동하지 않을 수 있습니다. 예를 들어, 텍스트 파일에 여러 줄에 하이픈이있는 단어가 포함되어 있으면이를 일치시키기 위해 좀 더 지능적인 작업을 수행해야합니다. 이 경우 행의 마지막 문자가 하이픈인지 확인하고, 하이픈 인 경우 행을 단어로 분리하기 전에 하이픈을 제거하고 다른 행을 읽습니다.

편집 : 대문자와 소문자를 구분하지 않고 라인에서 하이픈으로 연결된 단어를 처리하는 업데이트 된 버전입니다.

하이픈이있는 단어 (일부 단어는 줄에 걸쳐 있고 일부 단어는 줄에없는 단어)가 있으면 줄의 끝에 하이픈 만 제거했기 때문에 단어를 찾을 수 없습니다. 이 경우 하이픈이 제거 된 후에 모든 하이픈을 제거하고 단어를 일치시키는 것이 좋습니다. split 함수 바로 앞에 다음 줄을 추가하면됩니다.

s/-//g;

큰 스크립트로 지옥에. 당신이 모든 낱말을 움켜 쥐게 기꺼이하는 경우에,이 포탄 fu를 시도하십시오 :

cat *.txt | tr A-Z a-z | tr -cs a-z '\n' | sort | uniq -c | sort -rn | 
sed '/[0-9] /&, /'

그 (테스트 한) CSV 형식으로 빈도별로 정렬 된 모든 단어 목록을 제공하며 원하는 스프레드 시트로 쉽게 가져올 수 있습니다. 중지 단어가 있어야하는 경우 grep -w -F -f stopwords.txt 를 파이프 라인에 삽입하십시오 (테스트하지 않음).





word-frequency