Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python(NLP)で使える可読性インデックスとは?主要な指標と実装方法を解説

自然言語処理(NLP)とは、人間が日常的に使う言語をコンピュータに自動的に生成・理解させる技術に関する研究分野です。現在ではコンピュータ技術がほぼあらゆる業界に組み込まれており、NLPはますます注目度を高めています。本記事では、NLPの中でも「可読性(Readability)」というテーマに焦点を当てて解説します。可読性とは、あるテキストがどれほど読みやすく、理解しやすいかを示す概念です。

可読性インデックスとは

可読性インデックス(Readability Index)とは、テキストを読んで理解することの難易度(または容易さ)を数値で表した指標です。可読性を測定するテストにはさまざまな種類があり、それぞれ用途や適用言語が異なります。

一般的に「可読性とは、文書がどれほど容易に読めるかを示すものである」と定義されており、その計算手法は多数存在します。ただし、可読性テストは「読みやすさを予測するものと見なされるものの、可読性を判定する唯一の方法ではない」点にも注意が必要です。

一部のテストは言語に依存せず汎用的に使えますが、特定の言語に適したテストもあります。目的に合った可読性テストを選ぶためにも、それぞれの特徴を知っておくことが重要です。

主な可読性テスト一覧

可読性テスト
対象言語
概要と数式
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」を掛ける。
  • 前の2つの数値を合計する。
  • その合計を文の数で割る。
Rate Index(RIX)
西欧諸言語
西欧の任意の言語の文書に適用できる点が有用です。出力は0(非常に易しい)から55+(非常に難しい)までのスコアです。
RIX = (Long Words/ Sentences)
(long words = 文字数が6より多い単語)
Lesbarhets Index(LIX)
西欧諸言語
こちらも西欧の任意の言語の文書に適用できる点が有用です。出力は学年レベルを示す指数で、0.1未満が学年1相当、7.2以上が大学レベル相当となります。
LIX = (total words/ total sentences) +
(long words/ total words * 100)
(long words = 文字数が6より多い単語)

Fleschインデックスによる判定プログラムの前提条件

それでは、実際にFleschインデックスを使ってテキストファイルの可読性を判定するPythonプログラムを見ていきましょう。まず、Fleschインデックスのスコアと読解学年の対応関係は以下のように仮定します。

Fleschインデックス
テキストファイルの読解学年
0〜30
大学レベル
50〜60
高校レベル
90〜100
小学4年生レベル

上記の前提に基づき、Flesch-Kincaid Grade Levelの数式を使って、同等の学年レベルGを計算します。

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

サンプルコード

以下は、指定されたテキストファイルの文数・単語数・音節数をカウントし、Flesch-Kincaid Grade Levelから可読性レベルを判定するPythonプログラムの例です。

import os

# カレントディレクトリ内の.txtファイルを検索して可読性を判定する
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())

        # 音節数の概算(母音を数え、語尾のe/es/edを調整)
        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

        # Flesch-Kincaid Grade Levelによる学年レベルの算出
        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.')

実行結果

プログラムを実行すると、以下のようにテキストファイルの可読性レベルと単語数が出力されます。

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

まとめ

可読性インデックスを活用すれば、文章の難易度を客観的な数値として評価できます。本記事で紹介したように、ARIやFlesch Reading Ease、Flesch-Kincaid Grade Levelなど複数の指標が存在し、対象言語や用途に応じて使い分けることが重要です。Pythonを使えば、こうした指標を比較的簡単にプログラムへ組み込めるため、テキストマイニングやコンテンツ品質評価など、さまざまなNLPタスクに応用できます。

  1. Python・Matplotlibでグラフの外にテキストを配置する方法

    Matplotlibで作成したグラフ(プロット)の外にテキストを配置したい場合は、text_pos_x と text_pos_y の値を調整することで、テキストの表示位置を自由に変更できます。 ポイントは transform=plt.gcf().transFigure の指定です。これを設定すると、座標が図全体(Figure)を基準とした相対値(0〜1)として扱われるため、軸の範囲に制限されず、プロット領域の外側も含めた任意の場所にテキストを配置できるようになります。 手順 x と y のデータポイントを作成します。 テキストを配置する x・y の位置を初期化します。 plot() メソッド

  2. PythonとNLTKを使ったテキストのトークン化方法を徹底解説

    トークン化(Tokenization)とは?トークン化とは、与えられた文字列や文書単位を、トークンと呼ばれる小さな断片に分割する処理のことです。この際、句読点などの特定の文字を取り除く場合もあります。NLTKやPythonの文脈では、各トークンをリストに格納する処理を指します。これにより、テキストを1文字ずつ処理する代わりに、トークン単位で繰り返し処理を行えるようになります。自然言語処理(NLP)において、トークン化はテキスト分析の最初のステップとして非常に重要な役割を果たします。文章を意味のある単位に分解することで、その後の前処理や解析が格段に容易になります。トークン化の具体例例えば、次のよ