Python 统计托福作文词频

随着 AI 的大热,我的好奇心也受到了吸引。阅读了一些文章后发现,Pyhton 是一个非常适合 AI 编程的语言。于是开始了对其打怪升级的探索。

探索中发现,Python 提供丰富的库来帮助开发者们进行数据分析。自己由于工作需要,正好在准备托福写作。于是,当 Python 遇上 Tofel,一场美丽的邂逅便展开了。

目标

笔者完成了 5 篇托福作文后,想分析一下哪些词是我最常用的,进而学习这些词的同义词,扩大词汇量,然后在作文中自由替换。

思路

  1. 利用 Python 读取文件
  2. 统计每篇文章的词频
  3. 合并 5 篇文章的词频
  4. 输出前 10 词频的单词

行动

STEP 1:

导出作文

笔者使用 Evernote 进行写作,其支持导出 hmtl 格式文件。导出后,重命名文件方便读取。

重命名

STEP 2:

通过分析 html 文件,我发现正文都在 <body> 中。通过查询,发现 BeautifulSoup 库可以帮助处理 html 格式文件。

于是:

def filter_html(html):
    soup = BeautifulSoup(html, 'html.parser')
    # 需要过滤<title>标签,避免作文题目干扰
    text = soup.body.get_text()
    return text

STEP 3:
接下来,需要统计一篇文章中每个单词的出现个数。这里主要用到了 re, collections.counter 两个 Python 内置对象。

def calculate_words_frequency(file):
    # 读取文件
    with open(file) as f:
        # html 处理
        f = filter_html(f)

        line_box = []
        word_box = []
        
        # 转成小写并将句子分成词
        line_box.extend(f.strip().lower().split())
        
        # 去除标点符号的影响    
        for word in line_box:
            if not word.isalpha():
                word = filter_puctuation(word)
            word_box.append(word)
        
        # 统计词频
        word_box = fileter_simple_words(collections.Counter(word_box))

        return word_box

这里解释一下 filter_puctuation()这个函数。当笔者输出词频结果时,发现由于标点符号的存在,很多单词的尾部会跟着. , or ?

为了避免标点对词频统计的干扰,笔者使用了简单的正则去过滤掉标点。(正则不太会,测试时够用,应该有更简单和全面的写法)

# 过滤单词尾部的,.?"和头部的"
def filter_puctuation(word):
    return re.sub(r'(\,$)|(\.$)|(\?$)|(\"$)|(^\")', '', word)

STEP 4:

在测试结果集的时候发现,排名靠前的单词都是介词,代词,连词等常用词。如 he, and, that. 但这些词并不是笔者想要的,于是需要先把常用简单词汇给过滤掉,再统计词频。(我手动敲了一些,应该网上有更全的清单)

def fileter_simple_words(words):
    # 过滤词清单
    simple_words = ['the', 'a', 'an', 'to', 'is',
                    'am', 'are', 'the', 'that', 'which',
                    'i', 'you', 'he', 'she', 'they',
                    'it', 'of', 'for', 'have', 'has',
                    'their', 'my', 'your', 'will', 'all',
                    'but', 'while', 'with', 'only', 'more',
                    'who', 'should', 'there', 'can', 'might',
                    'could', 'may', 'be', 'on', 'at',
                    'after', 'most', 'even', 'and', 'in',
                    'best', 'better', 'as', 'no', 'ever',
                    'me', 'not', 'his', 'her'
                    ]

    # words type is counter.
    for word in list(words):
        if word in simple_words:
            del words[word]

    return words

STEP 5:
快接近尾声啦。在统计完 1 篇文章的词频后,我需要将 5 篇文章的词频求和。鉴于 counter
对象的可加性,于是

def multiple_file_frequency(files):
    total_counter = collections.Counter()
    for file in files:
        total_counter += calculate_words_frequency(file)
    return total_counter

STEP 6:
求和之后,我想知道前 10 高频的词汇是哪些。

def most_common_words(files, number):
    total_counter = multiple_file_frequency(files)
    return total_counter.most_common(number)

STEP 7:
最后,使用 Python 可视化工具把结果生成柱状图。

def draw_figures(figures):
    labels, values = zip(*figures)
    indexes = np.arange(len(labels))
    width = 0.5
    plt.bar(indexes, values, width)
    plt.xticks(indexes, labels)
    plt.show()
Final results

大功告成。

学托福

好不容易算出来了结果,当然要好好利用啦。

通过同义词网站 Thesaurus,我可以查询单词的同义词。Take parents and teachers as examples.

parent thesaurus
image thesaurus

接下来我会选取一些同义词进行记忆,提高自己的词汇量,然后在写作中灵活替换,从而提高写作能力。当然,考试时,也会提高分数。

毕竟 appropriate word choice 是托福写作的一项考核标准。

改进

花了半天时间做这个小 Demo,有一些地方是自己觉得可以以后继续研究的。

  1. 简单词的词库更新
  2. 自动批量读取文件,无需重命名,手动输入
  3. 数据图更直观,美观 (研究 numpy, pandas, matplotlib.pyplot)
  4. 结果存储为 cvs,便于日后使用

Reference

Github 项目地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,498评论 25 707
  • 其实一直以来我对日本的很多东西都是很反感的。其中的原因自不用说。但是当我看到日本著名的作家川端康成写的散文临终的眼...
    邀月成三阅读 533评论 0 0
  • 猥琐男人与刻薄女人是大学同学,毕业后又在同一个单位工作,同时评了高级职称,今年又搭了班子,这缘分可谓是不浅。 猥琐...
    隔三儿差五起高调阅读 638评论 0 0