어떤 책을 이해하기 위해 어느 정도의 취학 정도가 필요한지 알기 위해서, 전문가가 직접 책을 읽고 판단할 수도 있겠지만, 알고리즘을 통해 계산하는 방법도 가능하지 않을까?
그러한 시도로 Coleman-Liau index가 있다. 보통 글은 단어가 길 수록, 문장이 길 수록 어렵다는 점에서 착안해 한 텍스트의 글자, 단어 및 문장 수를 이용하여 공식으로 만든 것이다.
사용자에게 텍스트를 입력받아 Coleman-Liau index를 계산하여 아래와 같이 출력하는 프로그램을 만든다.
$ ./readability
Text: Congratulations! Today is your day. You're off to Great Places! You're off and away!
Grade 3
int main(void)
{
// 유저의 입력 받기
string text = get_string("Text: ");
int textLen = strlen(text);
// 문자, 단어, 문장의 수 집계
float letterCnt = countLetter(text, textLen);
float wordCnt = countWord(text, textLen);
int sentenceCnt = countSentence(text, textLen);
// Coleman-Liau Index 계산
int nGrade = calculateIndex(letterCnt, wordCnt, sentenceCnt);
// 결과 출력
if (nGrade < 1)
{
printf("Before Grade 1\n");
}
else if (nGrade > 15)
{
printf("Grade 16+\n");
}
else
{
printf("Grade %i\n", nGrade);
}
}
float countLetter(string text, int length)
{
int result = 0;
for (int i = 0; i < length; i++)
{
char c = text[i];
if (isalpha(c))
{
result++;
};
}
return result;
}
float countWord(string text, int length)
{
int result = 1;
for (int i = 0; i < length; i++)
{
char c = text[i];
if (c == ' ' && isalpha(text[i + 1]))
{
result++;
}
}
return result;
}
float countSentence(string text, int length)
{
int result = 0;
for (int i = 0; i < length; i++)
{
char c = text[i];
if (c == '.' || c == '!' || c == '?' || c == ':')
{
char str1[2];
char str2[3];
strncpy(str1, &text[i - 2], 2);
strncpy(str2, &text[i - 3], 3);
if (strncmp(str1, "Mr", 2) != 0 && strncmp(str2, "Mrs", 3) != 0)
{
result++;
}
}
}
return result;
}
int calculateIndex (float letter, float word, float sentence)
{
float L = letter / word * 100.00;
float S = sentence / word * 100.00;
int result = round(0.0588 * L - 0.296 * S - 15.8);
return result;
}
if (isalpha(c))
와 같은 경우에는 생략하는 것이 더 깔끔해 보이는 것 같다.