打算用python分析一次啊考研真题单词的词频,并加上翻译等内容,方便背诵

读取word文件

手头有近20年的考研英语一二真题word文件几十个,需要对每个文件的内容进行读取,并提取属于文章和题目的部分,即去掉介绍部分

使用docx包来读取word,因为只支持docx后缀,所以原有文件另存为docx形式
导入库,并设立要去掉的标点符号以及停用词,其中停用词通过nltk库from nltk.corpus import stopwords 导入

from docx import Document
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import re
from nltk.stem import PorterStemmer
from nltk.stem.lancaster import LancasterStemmer
from nltk.stem.snowball import SnowballStemmer
from nltk.stem import WordNetLemmatizerinterpunctuations = [',', '.', ':', ';', '?', '(', ')', '[', ']', '&', '!', '*', '@', '#', '$', '%', '_', '-', '—', '"', '“', '”', "'"]
stops = set(stopwords.words("english"))

通过docx的Document方法可以读取word文件,将要读取的文件组成一个列表

docxs1 = [Document(str(year)+'-1.docx') for year in range(1998, 2022)]

分词

下面输入文件名列表,输出分好词的列表

def get_words(docxs):    # 输入文件名列表,输出单词列表(去标点数字符号,题目要求标题)words = []   # 储存单词for doc in docxs:    # 遍历每一个文件for para in doc.paragraphs:     # 遍历文件中的每一个段落if len(para.runs)>=1 and len(para.text)>=1:   # 确实是有效段落if para.runs[0].font.bold or para.runs[0].font.italic:  # 如果是粗体或者斜体,不处理continue# s = re.sub(r'[.*?]', ' ', para.text)s = re.sub(r'[[A-Z]+]', ' ', para.text)   # 去掉特殊符号s = re.sub(r'[0-9]+', ' ', s)s = re.sub(r'②|③|①|④|⑤|⑥|⑦|⑧|⑨|⑩|⑪|⑫|⑬|⑭|⑮|⑯|⑰|_|—|-|\.', ' ', s)s = re.sub(r'\[0-9a-z]', ' ', s)# print(s)s_words = word_tokenize(s)  # 分词# print(s_words)cutwords = [word for word in s_words if word not in interpunctuations] cutwords = [word.lower() for word in cutwords if word not in stops]   # 去除停用词与标点if cutwords:if cutwords[0] == 'read' or cutwords[0] == 'translate':   # 有的翻译和阅读题目介绍没有粗体和斜体continuewords+=cutwordsreturn words

docx 中的 runs 一个run对象是相同样式文本的延续(只要文本的格式没有改变,那么就是一个run,一旦改变了就是列外一个run了) 所以我们使用para.runs[0].font.bold or para.runs[0].font.italic来判断这一段的开头是否为粗体或者斜体
因为在文件中,题目介绍是粗体或斜体,这部分不参与统计:

使用re库 正则表达式re.sub来替换特殊符号等为空格,后续分词可直接分开 re.sub使用参考https://blog.csdn.net/jackandsnow/article/details/103885422
其中[[A-Z]+]为中括号里面带字母的,[0-9]+为连续或非连续数字,②|③|①|④|⑤|⑥|⑦|⑧|⑨|⑩|⑪|⑫|⑬|⑭|⑮|⑯|⑰|_|—|-|.为特殊符号,因为.表示所有除换行符以外的符号,所以在前面加\转义,表示为.本身


分词 使用nltk中的word_tokenize进行分词,去除停用词与标点符号,最后将所有文件和段落分词列表叠加,输出words

NLTK词干提取(词形还原)

为了提高词性还原的准确度,采用nltk的WordNetLemmatizer方法,WordNetLemmatizer可通过单词,词性(可选)两个参数提取词干,为了提高准确率,首先提取每一个单词的词性

>>> from nltk.stem import WordNetLemmatizer
>>> import nltk
>>> lem = WordNetLemmatizer()
>>> nltk.pos_tag(['better'])
[('better', 'RBR')]
>>> lem.lemmatize('better', 'RBR')
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "D:\anaconda\lib\site-packages\nltk\stem\wordnet.py", line 38, in lemmatizelemmas = wordnet._morphy(word, pos)File "D:\anaconda\lib\site-packages\nltk\corpus\reader\wordnet.py", line 1906, in _morphyexceptions = self._exception_map[pos]
KeyError: 'RBR'
>>> lem.lemmatize('better', 'a')
'good'
>>> lem.lemmatize('better', wordnet.ADV)
'well'
>>> lem.lemmatize('better', wordnet.ADJ)
'good'

如上可看出,pos_tag可获得单词的词性,但词性直接用作lemmatize的参数会发生错误,所以需要转换一下(应该是NLTK的小缺憾),可以用的参数为wordnet里面的词性
转换函数:

from nltk.corpus import wordnet
def get_wordnet_pos(tag):       # 词性转化翻译if tag.startswith('J'):return wordnet.ADJelif tag.startswith('V'):return wordnet.VERBelif tag.startswith('N'):return wordnet.NOUNelif tag.startswith('R'):return wordnet.ADVelse:return ''

获得词干:输入单词列表,输出词干列表

def get_stems(words):   # 获得词干lem = WordNetLemmatizer()    # 词形还原words_tag = nltk.pos_tag(words)words_final = []for couple in words_tag:if couple[0][0]<'a' or couple[0][0]>'z' or len(couple[0])<=1:   # 去除非单词及空格continueif get_wordnet_pos(couple[1]):words_final.append(lem.lemmatize(couple[0], get_wordnet_pos(couple[1])))else:words_final.append(lem.lemmatize(couple[0]))return(words_final)

统计个数

import collections
coun = dict(collections.Counter(words_final).most_common())

使用collections库的counter,返回每个单词及其个数,most_common(n)为返回由大到小前n个,默认为从大到小返回全部

翻译

这里使用有道智云的文本翻译API,参照文档中的python3写法
文本翻译API文档

使用参考
https://zhuanlan.zhihu.com/p/59527880

import uuid
import requests
import hashlib
import time
import json# APPID 与 秘钥
appid = '****'
secretKey = '********'
myurl = 'https://openapi.youdao.com/api'def encrypt(signStr):hash_algorithm = hashlib.sha256()hash_algorithm.update(signStr.encode('utf-8'))return hash_algorithm.hexdigest()def translate(q):# 将key设置为字典,填写参照文档data = {}data['from'] = 'en'data['to'] = 'zh-CHS'data['signType'] = 'v3'curtime = str(int(time.time()))data['curtime'] = curtimesalt = str(uuid.uuid1())signStr = appid + q + salt + curtime + secretKeysign = encrypt(signStr)sign = encrypt(signStr)data['appKey'] = appiddata['q'] = qdata['salt'] = saltdata['sign'] = signheaders = {'Content-Type': 'application/x-www-form-urlencoded'}# 使用requests的post获取response = requests.post(myurl, data=data, headers=headers)# print(response.content)# 对response的内容解码result_all = response.content.decode("utf-8")# 转换为json形式result = json.loads(result_all)if 'basic' in result:return result['basic']['explains']else:return '释义错误'

最后的result为一个字典,里面有包括源词、语言、翻译等
其中字典的解释在basic中的explains中,故进行提取,若没有,说明单词出现错误

def translate_alls(coun):ans = {}for k,v in coun.items():trans = translate(k)ans[k] = [v, trans]return ans

translate_alls函数:输入统计的单词,对于每一个单词,进行翻译,并把单词、翻译、词频放入同一个字典中

综上

将上面的函数进行操作

words_1 = get_words(docxs1)  # 由文件获得分词列表
words_final_1 = get_stems(words_1)  # 获得词干列表
coun_1 = dict(collections.Counter(words_final_1).most_common()) # 进行统计
ans_1 = translate_alls(coun_1)  # 调用API获得翻译+词频字典

python写入Excel

这里使用openpyxl进行Excel的读写

from openpyxl import Workbook, load_workbookwb = load_workbook('words_times.xlsx')  # 加载文件
ws_2 = wb.create_sheet('考研英语一1')  # 建立新sheetfor k,v in ans_1.items():  # 对于字典中每一项,写入一行ws_2.append([k, v[0], str(v[1])])
wb.save('words_times.xlsx')  # 保存

结果

单词结果自取:

链接:https://pan.baidu.com/s/1Zdr8yDZ607ZuGMxjJQg28A
提取码:s985

结果分为英一、英二、英一+英二

python分词考研英语真题词频(附结果)——读取word、nltk、有道智云API相关推荐

  1. 用Python分析了1980~2015年考研英语真题词汇,原来考研英语应该这样考!

    微信改版,加星标不迷路! 用Python分析了1980~2015年考研英语真题词汇,原来考研应该这样考! 作者:阿广 概述 前言 数据介绍 实现过程 考研英语词汇统计分析 搞笑一刻 阿广说 每日问题 ...

  2. Python 分析 35 年的考研英语真题词汇,解读孤独的考研大军!

    作者 | 阿广 责编 | 郭芮 我们渐渐长大,从一开始的初生牛犊不怕虎到渐渐惧怕孤独,从一开始的单打独斗到渐渐合群躲避孤独.不巧的是,考研就是一个孤单修炼的事情,没有任何人能够去帮你,于是二十出头的我 ...

  3. 考研英语真题-四六级真题-计算机二级真题分享

    考研英语真题-四六级真题-计算机二级真题分享 准备的资料 给准备复习朋友准备了一堆资料,收集整理自网络,欢迎转发分享给你需要的朋友. 这次准备的资料分别有: •考研英语一和考研英语二,2009年至20 ...

  4. 考研英语真题笔记 2020

    英语真题笔记 2020 阅读 Text1 阅读 Text2 阅读 Text3 阅读 Text4 2020 阅读 Text1 response more to actions than to looks ...

  5. 2001年考研英语真题

    目录 2001年全国硕士研究生招生考试 Text 1 first paragraph: second paragraph: third paragraph: fourth paragraph: htt ...

  6. 用python求解考研数学真题

    考研数学中会涉及到很多微积分的题目.微积分是高等数学最重要的概念,对于这么重要的数学工具,python肯定不会错过.我们不难找到,在sympy这个python数学计算模块中,存在Derivative和 ...

  7. in use 大学英语4word_考研英语真题干货 | run on

    这是2019年,英语(一)的完形填空 But phones  2 on batteries, and batteries candie faster than we realize. 这句是两个句子, ...

  8. 考研英语真题笔记 2020,Java数据结构面试题及答案

    They housed(给-房子住) eight adult rats with two types of robotic rat(机械老鼠) - one social(社会的,社交的) and on ...

  9. 【唐迟阅读】考研英语真题题型分类,话题划分

    关注我获取更多学习方面的知识,和我共同进步吧~

最新文章

  1. 《Python和Pygame游戏开发指南》——1.12 图书中的文本折行
  2. shell+中sum的用法_Shell中函数使用
  3. elasticsearch 第四篇(API约定)
  4. L1-036. A乘以B
  5. 根据权威文献区分梯度上升与梯度下降
  6. 计算属性的setter和getter
  7. 学习Spring Boot:(十一) 自定义装配参数
  8. linux phpstudy
  9. C++ 常见错误(01) —— error LNK1104: 无法打开文件“avcodec.lib”
  10. FormsAuthentication使用指南
  11. Java网络编程总结
  12. Camshift原理
  13. flash 图片有描边 html,Flash遮罩制作线条逐渐显示的汽车轮廓动画效果
  14. PCQQ official算法逆向
  15. 《阿里巴巴大数据实践-大数据之路》读后感言
  16. android 播放器 samba,超强本地播放器一款支持samba、FTP/Windows共享服务-简单不折腾...
  17. python读取grd数据_python批处理系列代码-GRD转TIF
  18. 团队作业3-项目alph版本总结
  19. python 数据分析--数据处理工具Pandas(2)
  20. 【笑小枫的SpringBoot系列】【四】SpringBoot返回统一结果包装

热门文章

  1. 如何修改Oracle VM virtualbox虚拟机的屏幕大小
  2. 华为畅享10与10s有什么区别?哪个更好
  3. 如何成为名副其实的测试架构师?
  4. 通往测试架构师之路(1):那些家伙在干什么?
  5. 树莓派4b摄像头使能
  6. 【高德地图API】如何转到高德坐标系?
  7. python算法——字符串表达式的计算
  8. 【c语言】矩阵的创建
  9. WordPress 配置七牛云 CDN 具体操作
  10. 基于微信小程序的商城购物系统的设计与实现(论文+源码)_kaic