用Python实现英文文章难度评级

Python022

用Python实现英文文章难度评级,第1张

By Jiaxian Shi

英文文章的难度从直觉上来讲可以从以下两方面来定义:

句子的难易程度可以从句子的长度和复杂性(从句数量,嵌套)方面来考虑。词汇的难易程度可以从词汇的长度和使用频率(专业词汇,罕见词汇)方面来考虑。通过查阅维基百科等相关资料,发现目前普遍得到运用的可读性标准为Flesch–Kincaid可读性测试指标。Flesch–Kincaid可读性测试指标由两个指标构成:Flesch Reading Ease(FRE)和Flesch–Kincaid Grade Level(FKGL)。与我们的直觉一致,两者都使用了类似的方法:句子长度和词汇长度(由音节数确定,不单纯考虑字母数)。由于两个指标对句子长度和词汇长度所采取的权重不同(包括正负号),所以两个指标的意义相反:FRE数值越高,文章就越简单,可读性也越高。而FKGL数值越高,文章就越复杂,文章的可读性也就越低。

使用Python强大的自然语言处理(NLP)包NLTK,来实现下述3个功能:

其中,断句使用NLTK提供的非监督学习的预训练模型tokenizers/punkt/english.pickle,分词则使用NLTK推荐的word_tokenize函数(使用TreebankWordTokenizer和PunktSentenceTokenizer模块),分音节则使用NLTK供的SyllableTokenizer模块。需要注意的是,分词会将标点符号分为一个单词,需要手动去除。同时,分音节时会讲英语中的连字符“-”分为一个音节,也需要手动去除。另外,文章需要进行预处理,去除回车符和空格,并将非标准标点符号转换为英文标准标点符号。

统计出句数,词数和音节数后,即可根据上文提供的公式计算出FRE和FKGL了。本程序使用4段不同类型的英文文章分别计算FRG和FKGL,并使用matplotlib模块绘制出柱状图已做比较。

文章:

比较结果如下图所示:

可以发现,文章的难度为:儿童文学<侦探小说<杂志文章<学术论文,这与我们的实际感受是一致的。

词法分析器首先是断句,可以考虑用正则表达式,下面的例子可以参考

import re

s = "hello, "

s = "My name is Mike."

s = "I'm ab!"

while s != '':

    match = re.search('^[a-z|A-Z|\']+', s)

    if match:

        print('<' + s[:match.end()] + '>')

        s = s[match.end():]

    else:

        print('<' + s[:1] + '>')

        s = s[1:]