자연어처리(빈도분석)

1 minute read

빈도분석

데이터 로딩

    # cp949는 행과 열로 구성되어있는 데이터를 읽을 때 사용
    def read_data(filename, encoding='cp949'): # 읽기 함수 정의
        with open(filename, 'r', encoding=encoding) as f:
            # 열 사이는 \t로 나뉘어져있고 라인 별로 가져와서 리스트 형태로 저장한다.
            data = [line.split('\t') for line in f.read().splitlines()]
            data = data[1:] # txt 파일의 헤더(id document label)는 제외하기
        return data
    def write_data(data, filename, encoding='cp949'): # 쓰기 함수도 정의
        with open(filename, 'w', encoding=encoding) as f:
        f.write(data)
    data = read_data('ratings_small.txt' , encoding='cp949') # 전체파일은 ratings.txt

전체 데이터 형태소 분석

    morphed_data = 
    ''
    for data_each in data:
        morphed_data_each = rhinoMorph.onlyMorph_list(rn, data_each[1], pos=['NNG', 'NNP', 'VV', 'VA', 'XR', 'IC', 'MM', 'MAG', 'MAJ'], eomi= True)
        joined_data_each = ' '.join(morphed_data_each) # 문자열을 공백을 두고 하나로 연결
    if joined_data_each: # 내용이 있는 경우만 저장하게 함
        morphed_data += data_each[0]+"\t"+joined_data_each+"\t"+data_each[2]+"\n"
    # 형태소 분석된 파일 저장
    write_data(morphed_data, 'ratings_morphed.txt', encoding='cp949')

Counter

리스트의 구성요소를 종류별로 빈도를 계산한다.

    from collections import Counter
    mergedText = ' '.join(morphed_data) # 좋은 방법. 공백을 추가하며 일단 모든 리스트 요소들을 결합한다, 텍스트를 읽어올 경우 없어도 된다.
    print('mergedText:', mergedText)
    mergedTextList = mergedText.split(' ') # 결합된 요소들을 공백 단위로 분리하여 하나의 리스트로 만든다
    print('mergedTextList:', mergedTextList)
    wordInfo = Counter(mergedTextList) # 하나의 리스트로 묶인 분리된 요소들을 카운트한다 (내림차순)
    print('wordInfo:', wordInfo)

시각화 전 정렬

    sample = {'여름':1, '과일':2, '딸기':3}
    print(sorted(sample, reverse=True)) # 역순으로 정렬 -> 여름 딸기 과일
    print(sorted(sample, key=sample.get, reverse=True)) # sample.get의 출력된 값을 기준으로 sample을 정렬 ex)-> 딸기 과일 여름
    print(sorted(sample.values(), reverse=True)) # 값 부분만 출력하여 정렬 -> 3 2 1

시각화

    # 앞에서 20개까지만 출력
    sorted_keys = sorted(wordInfo, key=wordInfo.get, reverse=True)
    sorted_values = sorted(wordInfo.values(), reverse=True)
    import matplotlib.pyplot as plt
    plt.bar(range(20), sorted_values[:20]) #y축
    plt.xticks(range(20), sorted_keys[:20]) #x축
    plt.show()

GitHub Logo

Word Cloud

    !pip install wordcloud # 워드클라우드 패키지 설치
    from wordcloud import WordCloud
    # 기본 배경은 블랙이고 background_color 로 색을 지정할 수 있다.
    cloud = WordCloud(font_path=fontpath, width=800, height=600).generate(" ".join(data_text))
    plt.imshow(cloud, interpolation='bilinear') # 글자를 더 부드럽게 나오게 한다
    plt.axis('off') # 축의 위치 정보 off
    plt.show()

GitHub Logo

  • 마스크 지정하기

wordcloud에 이미지를 입혀서 구성할 수 있다.

    alice_mask=np.array(Image.open(path.join(d,"alice.png")))
    cloud = WordCloud(font_path=fontpath, width=800, height=600).generate(" ".join(data_text))

GitHub Logo

Leave a comment