Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python(NLP)으로 계산하는 텍스트 가독성 지수: 주요 가독성 테스트 공식과 구현 방법

자연어 처리(NLP, Natural Language Processing)는 인간이 사용하는 자연 언어를 컴퓨터가 자동으로 생성하고 이해하는 방법을 연구하는 분야입니다. 오늘날 컴퓨터 기술이 거의 모든 산업 분야에 통합되면서 NLP는 점점 더 중요하고 흥미로운 연구 과제가 되고 있습니다. 이번 글에서는 자연어 처리의 여러 하위 분야 중 하나인 가독성(Readability)에 대해 집중적으로 살펴보겠습니다.

가독성이란 텍스트를 읽고 이해하는 것이 얼마나 어려운지를 나타내는 개념입니다. 그리고 가독성 지수(Readability Index)는 이러한 난이도를 하나의 수치 값으로 표현한 것입니다. 가독성을 판단하는 데에는 여러 가지 테스트 방식이 존재하며, 각 테스트마다 적합한 용도와 대상 언어가 다릅니다.

"가독성이란 문서를 읽을 수 있는 용이함(ease)을 의미한다" [13]라는 정의처럼, 가독성을 계산하기 위한 다양한 테스트 [9]가 개발되어 왔습니다. 다만 가독성 테스트는 "읽기 용이성을 예측하는 도구로 간주될 뿐, 가독성을 판단하는 유일한 방법은 아니다"라는 점을 유의해야 합니다.

일부 테스트는 언어에 구애받지 않지만, 특정 언어에 더 잘 맞는 테스트도 있습니다. 따라서 각 가독성 테스트의 특성을 이해하는 것이 매우 중요합니다.

주요 가독성 테스트 종류

가독성 테스트대상 언어간단한 설명 및 공식
Automated Readability Index (ARI)영어텍스트의 이해 가능성을 측정하기 위해 고안되었습니다. 출력값은 텍스트를 이해하는 데 필요한 미국 학년 수준을 근사적으로 나타냅니다.
ARI = 4.71 * (characters/words) 
+ 0.5 * (words/sentence) - 21.43
Flesch Reading Ease영어독해 지문을 이해하는 난이도를 나타내기 위해 고안되었습니다. 점수가 높을수록 읽기 쉬운 자료이며, 점수가 낮을수록 읽기 어려운 지문을 의미합니다.
FRE = 206.835 − 1.015 * (total words/
total sentences) − 84.6 * (total
syllables/total words)
Flesch-Kincaid Grade Level영어독해 지문의 이해 난이도를 나타냅니다. 결과값은 미국 학년 수준에 해당하는 숫자입니다.
FKGL = 0.39 * (total words/total
sentences) + 11.8 * (total syllables/
total words) - 15.59
Coleman-Liau Index영어텍스트의 이해 가능성을 측정합니다. 출력값은 텍스트를 이해하는 데 필요하다고 여겨지는 대략적인 미국 학년 수준입니다.
CLI = (5.89 * (characters/words)) −
(30 * (sentences/words)) − 15.8
Gunning Fog Index영어영어 글 샘플의 가독성을 측정하기 위해 고안되었습니다. 결과 지수는 독자가 처음 읽었을 때 텍스트를 쉽게 이해하기 위해 필요한 정규 교육 연수(미국 학년 기준)를 나타냅니다.
GFI = 0.4 * ((words/sentence) +
100 * (complex words/words))
Linsear Write영어영어 텍스트 전용 가독성 지표로, 미 공군이 기술 매뉴얼의 가독성을 계산할 수 있도록 개발되었습니다. Wikipedia에 소개된 공식은 다음과 같습니다:
  • 글에서 100단어 분량의 샘플을 추출합니다.
  • 쉬운 단어(2음절 이하로 정의)를 세고, a, an, the 등의 단순한 단어를 포함해 각 단어에 "1"을 부여합니다.
  • 어려운 단어(3음절 이상으로 정의)를 세고, 사전 발음 기준으로 각 단어에 "3"을 부여합니다.
  • 쉬운 단어 수에 "1"을 곱합니다.
  • 어려운 단어 수에 "3"을 곱합니다.
  • 앞의 두 값을 서로 더합니다.
  • 그 합계를 문장 수로 나눕니다.
Rate Index (RIX)서유럽 언어서유럽 계열의 어떤 언어 문서에도 적용할 수 있다는 점에서 유용합니다 [3]. 출력값은 0(매우 쉬움)부터 55+(매우 어려움) 사이의 점수입니다.
RIX = (Long Words/Sentences)
(long words = 글자 수 > 6인 단어)
Lesbarhets Index (LIX)서유럽 언어서유럽 계열의 어떤 언어 문서에도 적용할 수 있다는 점에서 유용합니다 [2][3]. 출력값은 학년 수준을 나타내는 지수로, 0.1 미만이면 1학년 수준, 7.2 이상이면 대학 수준을 의미합니다.
LIX = (total words/total sentences) +
(long words/total words * 100)
(long words = 글자 수 > 6인 단어)

예를 들어, 아래에서는 Flesch 지수를 활용해 텍스트 파일의 가독성을 판단하는 프로그램을 살펴보겠습니다.

Flesch 지수 판정 기준

Flesch 지수텍스트 파일 읽기 학년 수준
0~30대학(College)
50~60고등학교(High School)
90~100초등학교 4학년(Fourth Grade)

위 기준에 따라 Flesch-Kincaid Grade Level 공식을 사용하면 해당 학년 수준 G를 계산할 수 있습니다.

FKGL = 0.39 * (total words/total sentences) + 11.8 * (total syllables/total words) - 15.59

구현 코드

import os

dire = os.getcwd()
listOfdir = os.listdir(dire)

while True:
    UserFileName = input('Enter file name:')
    if (UserFileName in listOfdir) and (UserFileName.endswith(".txt")):
        InputFile = open(UserFileName, 'r')
        text = InputFile.read()
        sentence = text.count('.') + text.count('!') + text.count(';') + text.count(':') + text.count('?')
        words = len(text.split())
        syllable = 0
        for word in text.split():
            for vowel in ['a', 'e', 'i', 'o', 'u']:
                syllable += word.count(vowel)
            for ending in ['es', 'ed', 'e']:
                if word.endswith(ending):
                    syllable -= 1
            if word.endswith('le'):
                syllable += 1
        G = round((0.39 * words) / sentence + (11.8 * syllable) / words - 15.59)
        if G >= 0 and G <= 30:
            print('The Readability level is College')
        elif G >= 50 and G <= 60:
            print('The Readability level is High School')
        elif G >= 90 and G <= 100:
            print('The Readability level is fourth grade')
        print('This text has %d words' % (words))
    elif UserFileName not in listOfdir:
        print('This text file does not exist in current directory')
    elif not (UserFileName.endswith('.txt')):
        print('This is not a text file.')

코드 동작 원리

이 프로그램은 다음과 같은 순서로 작동합니다:

1. 현재 디렉터리의 파일 목록을 불러옵니다.
2. 사용자에게 텍스트 파일 이름(.txt)을 입력받습니다.
3. 마침표(.), 느낌표(!), 세미콜론(;), 콜론(:), 물음표(?)의 개수를 세어 문장 수를 계산합니다.
4. 공백을 기준으로 단어를 분리해 단어 수를 구합니다.
5. 각 단어에서 모음(a, e, i, o, u)의 개수를 세고, 'es', 'ed', 'e'로 끝나는 경우 1을 빼며, 'le'로 끝나는 경우 1을 더해 음절 수를 추정합니다.
6. FKGL 공식에 대입해 학년 수준 G를 계산하고, 미리 정의된 기준에 따라 가독성 수준을 출력합니다.

실행 결과

Enter file name:dataVisualization.txt
The Readability level is College
This text has 64 words

실행 결과를 보면, 'dataVisualization.txt' 파일은 대학(College) 수준의 가독성을 가진 텍스트이며, 총 64개의 단어로 구성되어 있음을 알 수 있습니다. 이처럼 Python을 활용하면 몇 줄의 코드만으로도 텍스트의 가독성을 손쉽게 정량화할 수 있습니다.