首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【python】英语单词文本处理

【python】英语单词文本处理

作者头像
Qomolangma
发布于 2024-07-30 04:27:24
发布于 2024-07-30 04:27:24
18500
代码可运行
举报
文章被收录于专栏:深度学习深度学习
运行总次数:0
代码可运行

前言

  缘起自懒得考小孩儿单词,最终效果如图:

  本文记录了英语单词文本处理过程,生成“试卷”

PS:单词docx文件来源于百度文库高校版(单词txt文本附文末)

一、环境

实验所需的库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import numpy as np
from PIL import Image, ImageDraw, ImageFont

终端指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
conda create -n DL python==3.11
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
conda activate DL
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
conda install numpy pillow

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install numpy pillow

二、实现过程

  大过年的,暂不对代码进行详细介绍,其进化过程如下:

Version 1 起源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re


with open('./word.txt', 'r', encoding='utf-8') as file:
    for line in file:
        if re.match(r'^[A-Za-z*]', line):  # 使用正则表达式匹配以英文字母开头的行
            if 'Module' in line:
                continue
            if '[' not in line:  # 如果行中没有 [
                print("无法解析的行:", line)  # 直接输出行的内容
                continue
            word, pro_chinese = line.strip().split('[')
            pronunciation, meaning = pro_chinese.strip().split(']')
            pronunciation = '[' + pronunciation + ']'  # 将括号加回去
            meaning = meaning.rstrip()  # 去掉末尾的换行符
            print("单词:", word)
            print("音标:", pronunciation)
            print("中文:", meaning)

Version 2 list

  存储为列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re


words, pronunciations, meanings, modules = [], [], [], []
with open('./word.txt', 'r', encoding='utf-8') as file:
    current_module = ""
    for line in file:
        if re.match(r'^[A-Za-z*]', line):  # 使用正则表达式匹配以英文字母开头的行
            if 'Module' in line:
                current_module = line.strip()
                # print(current_module)
                continue
            if '[' not in line:  # 如果行中没有 [
                # print("无法解析的行:", line)  # 直接输出行的内容
                continue
            word, pro_chinese = line.strip().split('[')
            pronunciation, meaning = pro_chinese.strip().split(']')
            pronunciation = '[' + pronunciation + ']'  # 将括号加回去
            meaning = meaning.rstrip()  # 去掉末尾的换行符
            # print("单词:", word)
            # print("音标:", pronunciation)
            # print("中文:", meaning)
            words.append(word)
            pronunciations.append(pronunciation)
            meanings.append(meaning)
            modules.append(current_module)

for i in range(len(words)):
    print(modules[i], words[i], pronunciations[i], meanings[i])

Version 3 array

  存储为array数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import numpy as np

words, pronunciations, meanings = np.array([]), np.array([]), np.array([])

with open('./word.txt', 'r', encoding='utf-8') as file:
    current_module = ""
    for line in file:
        if re.match(r'^[A-Za-z*]', line):  # 使用正则表达式匹配以英文字母开头的行
            if 'Module' in line:
                current_module = line.strip()
                print(current_module)
                continue
            if '[' not in line:  # 如果行中没有 [
                print("无法解析的行:", line)  # 直接输出行的内容
                continue
            word, pro_chinese = line.strip().split('[')
            pronunciation, meaning = pro_chinese.strip().split(']')
            pronunciation = '[' + pronunciation + ']'  # 将括号加回去
            meaning = meaning.rstrip()  # 去掉末尾的换行符
            words = np.append(words, word)
            pronunciations = np.append(pronunciations, pronunciation)
            meanings = np.append(meanings, meaning)

for i in range(len(words)):
    print("单词:", words[i])
    print("音标:", pronunciations[i])
    print("中文:", meanings[i])

Version 4 结构化数组

  进化为结构化数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import numpy as np

# 定义结构化数组的数据类型
dt = np.dtype([('word', 'U50'), ('pronunciation', 'U50'), ('meaning', 'U50')])

# 创建空的结构化数组
data = np.array([], dtype=dt)

with open('./word.txt', 'r', encoding='utf-8') as file:
    for line in file:
        if re.match(r'^[A-Za-z*]', line):  # 使用正则表达式匹配以英文字母开头的行
            if 'Module' in line:
                continue
            if '[' not in line:  # 如果行中没有 [
                # print("无法解析的行:", line)  # 直接输出行的内容
                continue
            word, pro_chinese = line.strip().split('[')
            pronunciation, meaning = pro_chinese.strip().split(']')
            pronunciation = '[' + pronunciation + ']'  # 将括号加回去
            meaning = meaning.rstrip()  # 去掉末尾的换行符
            new_data = np.array([(word, pronunciation, meaning)], dtype=dt)  # 创建包含当前单词数据的结构化数组
            data = np.append(data, new_data)  # 将当前单词数据添加到总的结构化数组中

for i in data:
    print(i)

Version 5 区分单元且打乱顺序

  区分单元且打乱顺序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import numpy as np

# 定义结构化数组的数据类型
dt = np.dtype([('module', 'U50'), ('word', 'U50'), ('pronunciation', 'U50'), ('meaning', 'U50')])

# 创建空的结构化数组
data = np.array([], dtype=dt)

with open('./word.txt', 'r', encoding='utf-8') as file:
    current_module = ""
    for line in file:
        if re.match(r'^[A-Za-z*]', line):  # 使用正则表达式匹配以英文字母开头的行
            if 'Module' in line:
                current_module = line.strip()
                # print(current_module)
                continue
            if '[' not in line:  # 如果行中没有 [
                # print("无法解析的行:", line)  # 直接输出行的内容
                continue
            word, pro_chinese = line.strip().split('[')
            pronunciation, meaning = pro_chinese.strip().split(']')
            pronunciation = '[' + pronunciation + ']'  # 将括号加回去
            meaning = meaning.rstrip()  # 去掉末尾的换行符
            new_data = np.array([(current_module, word, pronunciation, meaning)], dtype=dt)  # 创建包含当前单词数据的结构化数组
            data = np.append(data, new_data)  # 将当前单词数据添加到总的结构化数组中


np.random.shuffle(data)
# 打印打乱顺序后的数组
print(data[0]['word'])
print(len(data))
for d in data:
    print(d)
for d in data:
    if d['module'] == 'Module 1':
        print(d)

Version 6 可视化

  可视化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import numpy as np
from PIL import Image, ImageDraw, ImageFont

# 定义结构化数组的数据类型
dt = np.dtype([('module', 'U50'), ('word', 'U50'), ('pronunciation', 'U50'), ('meaning', 'U50')])

# 创建空的结构化数组
data = np.array([], dtype=dt)

with open('./word.txt', 'r', encoding='utf-8') as file:
    current_module = ""
    for line in file:
        if re.match(r'^[A-Za-z*]', line):  # 使用正则表达式匹配以英文字母开头的行
            if 'Module' in line:
                current_module = line.strip()
                print(current_module)
                continue
            if '[' not in line:  # 如果行中没有 [
                print("无法解析的行:", line)  # 直接输出行的内容
                continue
            word, pro_chinese = line.strip().split('[')
            pronunciation, meaning = pro_chinese.strip().split(']')
            pronunciation = '[' + pronunciation + ']'  # 将括号加回去
            meaning = meaning.rstrip()  # 去掉末尾的换行符
            new_data = np.array([(current_module, word, pronunciation, meaning)], dtype=dt)  # 创建包含当前单词数据的结构化数组
            data = np.append(data, new_data)  # 将当前单词数据添加到总的结构化数组中

# 打印数组
print(data[0]['word'])
print(len(data))
for d in data:
    if d['module'] == 'Module 1':
        print(d)


np.random.shuffle(data)
# 打印打乱顺序后的数组
print(data)
# dt = np.dtype([('module', 'U50'), ('word', 'U50'), ('pronunciation', 'U50'), ('meaning', 'U50')])

problem_image = Image.new('RGB', (800, 1200), color='white')
draw = ImageDraw.Draw(problem_image)
# font = ImageFont.truetype("arial.ttf", 25)
c_font = ImageFont.truetype("STKAITI.TTF", 25)  # 华文楷体
e_font = ImageFont.truetype("times.ttf", 25)    # times new Roman

text_y = 100
draw.text((300, 20), 'English Problems', fill='blue', font=e_font)
for i in range(20):
    draw.text((50, text_y), str(i+1)+' '+data[i]['word'], fill='black', font=e_font)
    draw.text((350, text_y), str(i + 21) + ' ' + data[i+20]['meaning'], fill='black', font=c_font)
    text_y += 50

problem_image.save('en_problems_3.png')

# Generate a combined image of the answers
answer_image = Image.new('RGB', (800, 1200), color='white')
draw = ImageDraw.Draw(answer_image)


text_y = 100
draw.text((300, 20), 'English Problems', fill='blue', font=e_font)
for i in range(20):
    draw.text((50, text_y), str(i+1)+' '+data[i]['meaning'], fill='black', font=c_font)
    draw.text((450, text_y), str(i + 21) + ' ' + data[i+20]['word'], fill='black', font=e_font)
    text_y += 50

answer_image.save('en_answers_3.png')

问题:左侧前20英译汉,右侧汉译英:

答案:

三、txt文件

外研社小学英语五年级下册(三年级起点)单词表(带音标):

Module 1 still[stil]还,仍然 Programme’prəugræm节目 lady['leidi]女士,夫人 life[laif]生活 different['difrənt]不同的 ago[ə’gəu]以前 Interviewer['intɚvjuɚ]采访者 enough[i’nʌf]足够的 television['teliviiʒ(ə)n]电视机 *grandchildren’græn’tʃildrən(外)孙子(女) change[tʃendʒ]改变,变化 night[nait]夜晚,夜间 work[wɜ:k]工作;劳动;干活儿 field[fi:ld]田地 fire['faiə]火,炉火 orɔ:也不,也没 radio['reidiəu]收音机 telephone['telifəun]电话 couldn`t=could not不能 write[rait]写 hope[həup]希望

Module 2 learnt[lɜ:nt](learn的过去式)学习 taughttɔ:t教,讲授 language['læŋgwidʒ]语言 wroterəut写 dancer['dɑ:nsə®] 舞蹈演员 foreign['fɔrən]外国的 studied’stʌdid学习 hard[hɑ:d]努力地

Module 3 hamburger['hæmbɜ:gə®]汉堡 English['iŋgliʃ]英国(式)的 breakfast['brekfəst]早餐,早饭 lunch[lʌntʃ]午餐,午饭 sandwich['sænwitʃ]三明治 fish and chips炸鱼加炸薯条 traditional[trə’diʃənl]传统的 dish[diʃ]食品;菜肴 very much['veri mʌtʃ]很,非常 gave[geiv](give的过去式)给 tonight[tə’nait]今夜,今晚

Module 4 library['laibrəri]图书馆 student['stju:dnt]学生 sentsent发送,寄 *CD 激光唱片,光盘 idea[ai’diə]主意,想法 put[put]放,安放 *shelf[ʃelf]架子 heavy['hevi]重的,沉的 dictionary['dikʃənri]词典;字典 card[kɑ:d]卡片 library card图书卡,借书证 ask[ɑ:sk]邀请 wrong[rɔ:ŋ]错误的 dear[diə®]哎呀 information[ˌinfə’meiʃn]信息 *e-book电子书 project['prɔdʒekt]项目 guide[gaid]介绍,指南,手册 film[film]电影 as well又,还,也 way[wei]方法,方式 on[ɔn]关于 *topic['tɔpik]话题

Module 5 light[lait]轻的 hard[hɑ:d]困难的,费力的 *broken['brəukən]坏的,破的 department store[di’pɑ:tmənt stɔ:]百货商店 pocket['pɔkit]口袋,兜 umbrella[ʌm’brelə]雨伞 sales assistant[seilz ə’sistənt]售货员,营业员 wheel[wi:l]轮子 easy['i:zi]容易的,不费力的 take[teik]选择要,选择购买 too[tu:]太,过于 try[trai]试,尝试 lovely['lʌvli]美丽的,可爱的;令人愉快的

Module 6 moon[mu:n]月亮,月球 get[ɡet]到达 west[west]西,西部,西方;向西方 parent['peərənt]母亲;父亲;家长 stay[stei]停留 July[dʒu’lai]七月 south[sauθ]南,南部,南方;向南方 remember[ri’membə®]记得 June[dʒu:n]六月 east[i:st]东,东部,东方;向东方 best[best]最好的 north[nɔ:θ]北,北部,北方;向北方 rest[rest]休息 have a rest休息一下 rode[rəud](ride的过去式)骑

Module 7 evening['i:vniŋ]傍晚,晚上 late[leit]近日暮的;近深夜的;时间不早的 worker['wɜ:kə®]工人 factory['fæktri]制造厂;工厂 early['ɜ:li]早的 taxi['tæksi]出租车,计程车 quarter['kwɔ:tə®]一刻钟 to[tu,tə](距整点)差… worry['wʌri]焦虑,担心

Module 8 paper['peipə®]纸 Chinese[ˌtʃai’ni:z]中国人的 so[səʊ]如此,这样 word[wɜ:d]词,字 drewdru:画 cutkʌt剪,切,割 piece[pi:s]张,片,块 paint[peint](用颜料)绘画,着色 putput放,安放 stick[stik]小木棍,小木条 tied[taid](tie的过去式)扎上,系上 *string[striŋ]线,绳子

Module 9 laugh[lɑ:f]笑 worewɔ:®穿 letter['letə®]信,书信 theatre['θiətə]剧院 women’wimin女性,妇女 actor['æktə®]演员 toldtəuld口述,讲(故事等) joke[dʒəuk]笑话 after['ɑ:ftə®]在……以后 showʃəu演出,表演 restaurant['restrɔnt]饭店,餐馆 readri:d读 at all[æt ɔ:l]一点都 in[in]在(将来一段时间)之后 another[ə’nʌðə®]另一个 history['histri]历史 ask[ɑ:sk]问,询问 question['kwestʃən]问题 forget[fə’get]忘,忘记 bring[briŋ]带来,拿来 soon[su:n]不久,很快

Module 10 when[wen]在什么时候 end[end]结束,终止 nervous['nɜ:vəs]紧张的,情绪不安的 all right[ɔ:l rait]没事,没问题 airport['eəpɔ:t]机场 ticket['tikit]票 passport['pɑ:spɔ:t]护照 safe[seif]安全的,平安的 pet[pet]宠物 speak[spi:k]说,讲 building['bildiŋ]建筑物 American[ə’merikən]美国的;美国人的;美国人 find out[faind aut]发现,弄清 more[mɔ:®]更多的(量),较多的(量)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TThreadedSelectorServer介绍及Direct Memory OOM分析
一、TThreadedSelectorServer线程模型: 该服务会启动1个AcceptThread, 2个SelectorThread(默认为2个,可设置),一个woker线程池(池的大小可设置)
囚兔
2018/02/08
9080
TThreadedSelectorServer介绍及Direct Memory OOM分析
记一次内存溢出的分析经历——thrift带给我的痛orz
说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是我还是要来说说我的故事.................. ---- 背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的通信框架使用的是thrift。 thrif
Janti
2018/04/10
2.5K1
记一次内存溢出的分析经历——thrift带给我的痛orz
thrift RPC 修改源码支持获取client ip
使用thrift做项目的时候,用到了thrift框架,后来遇到一个很棘手的问题,就是在使用TBinaryProtocol TFramedTransport TNonblockingServerSocket等协议时,服务器端不支持获取client的ip地址。
angelo
2019/06/18
2.1K0
RPC-Thrift(一)
  注意点:1)Thrift客户端和服务端使用的I/O模型必须一致,上例中都是使用阻塞式同步I/O模型。
在周末
2019/08/26
3.9K0
RPC-Thrift(一)
JVM的Finalization Delay引起的OOM
今天在压力测试环境某一个服务出现crash了,经过一番检查,终于发现是由于JVM的Finalization Delay引起的,这个问题比较特殊,这里记录一下。 这个服务是用Java写的,主要完成的功能是根据特定的指令文件生成mp4文件,用到的java库主要有javacv,这个库底层其实是使用JNI调用操作系统里安装的ffmpeg。 检查日志文件 首先检查日志文件,发现日志里出现了OOM的报错 java.lang.OutOfMemoryError: null at sun.misc.Unsafe.alloc
jeremyxu
2018/05/10
1.5K0
Java NIO为何导致堆外内存OOM了?
某天报警:某台机器部署的一个服务突然无法访问。谨记第一反应登录机器查看日志,因为服务挂掉,很可能因OOM。这个时候在机器的日志中发现了如下的一些信息:
JavaEdge
2022/02/02
1.9K0
Java NIO为何导致堆外内存OOM了?
常识四堆外内存
堆外内存除了在像netty开源框架中,在平常项目中使用的比较少,在现前的项目中,QPS要求高的系统中,堆外内存作为其中一级缓存是相当有成效的。所以来学习一下,文中主要涉及到这三分部内容
码农戏码
2021/03/23
2.8K0
从0到1起步-跟我进入堆外内存的奇妙世界
堆外内存一直是Java业务开发人员难以企及的隐藏领域,究竟他是干什么的,以及如何更好的使用呢?那就请跟着我进入这个世界吧。
小程故事多
2018/08/22
4790
从0到1起步-跟我进入堆外内存的奇妙世界
为什么DirectBuffer是IO友好的
我们经常会听到,Java nio中的direct buffer对io更加友好些,但为什么呢?
KINGYT
2023/03/15
5560
为什么DirectBuffer是IO友好的
WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconne
1、启动kafka的脚本程序报如下所示的错误: 1 [hadoop@slaver1 script_hadoop]$ kafka-start.sh 2 start kafkaServer... 3 [2018-05-22 09:29:08,783] INFO Verifying properties (kafka.utils.VerifiableProperties) 4 [2018-05-22 09:29:08,942] INFO Property broker.id is overridden
别先生
2018/05/28
2.7K0
【Flink】第十七篇:记一次牛轰轰的OOM故障排查
昨天,分析修复了一个connector的问题。下面开始陈述整个过程,依旧按照之前的陈述思路进行:
章鱼carl
2022/03/31
3K1
【Flink】第十七篇:记一次牛轰轰的OOM故障排查
使用堆内内存HeapByteBuffer的注意事项
国庆假期一眨眼就过去了,本来在家躺平的很舒服,没怎么肝云原生编程挑战赛,传送门:https://tianchi.aliyun.com/s/8bf1fe4ae2aea736e692c31c6952042d ,偏偏对手们假期开始卷起来了,眼看就要被人反超了,吓得我赶紧继续优化了。比赛大概还有一个月才结束,Kirito 的详细方案也会在比赛结束后分享,这期间我会分享一些比赛中的一些通用优化或者细节知识点,例如本文就是这么一个例子。
kirito-moe
2021/10/18
1.5K0
springboot整合redis一直报远程主机强迫关闭了一个现有的连接
需要修改一下2处,好像timeout 默认就是0,tcp-keepalive默认就是300,那为什么还回报错呢?可能是启动的时候没有指定配置文件
九转成圣
2024/05/08
6730
记录 | 解决连接zookeeper报错No route to host
最近在学习微服务,遇到了很多问题,今天又遇到了个连接zookeeper报错的问题,在此记录下。
我的小碗汤
2018/10/18
2.8K0
记录 | 解决连接zookeeper报错No route to host
Elasticsearch 集群某一节点修改 IP 后无法启动问题复盘
节点换 IP 原因探讨:宿主机服务器的IP地址和别的服务器IP 冲突,所以要修改一台服务器的 IP地址。
铭毅天下
2023/08/18
6210
Elasticsearch 集群某一节点修改 IP 后无法启动问题复盘
从java的NIO版hello world看java源码,我们能看到什么?
SelectorProvider提供的所有provider都是同一个对象。如果没有,它会通过AccessController.doPrivileged来给获取provider的代码最高的权限,执行逻辑是:
爬蜥
2019/07/09
5320
Issue record: “No thread for socket” about Memcached
We own a service supplying not-real-time data to the downstream clients. In order to reduce the average latency and the pressure on database, Memcached was imported as the cluster center cache, and our service consumed it. I encountered an issue when Memcached was firstly deployed on production environment:
四火
2022/07/15
2040
Issue record: “No thread for socket” about Memcached
jvm 堆外堆内浅析
HeapByteBuffer与DirectByteBuffer,在原理上,前者可以看出分配的buffer是在heap区域的,其实真正flush到远程的时候会先拷贝得到直接内存,再做下一步操作 (考虑细节还会到OS级别的内核区直接内存),其实发送静态文件最快速的方法是通过OS级别的send_file,只会经过OS一个内核拷贝,而不会来回拷贝;在NIO的框架下,很多框架会采用 DirectByteBuffer来操作,这样分配的内存不再是在java heap上,而是在C heap上,经过性能测试,可以得到非常快速的网络交互,在大量的网络交互下,一般速度会比HeapByteBuffer 要快速好几倍。
山行AI
2019/09/25
1.5K0
jvm 堆外堆内浅析
Java NIO实现原理之Buffer
nio是基于事件驱动模型的非阻塞io,这篇文章简要介绍了nio,本篇主要介绍Buffer的实现原理。
Monica2333
2020/06/19
5900
JVM内存与垃圾回收篇第11章直接内存
第 11 章 直接内存 1、直接内存概述 直接内存 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 Java的NIO库允许Java程序使用直接内存,用于数据缓冲区 代码示例 代码 /** * IO
yuanshuai
2022/08/17
5370
JVM内存与垃圾回收篇第11章直接内存
推荐阅读
相关推荐
TThreadedSelectorServer介绍及Direct Memory OOM分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档