识别《冰与火》第一部的英语卡片 Part 3

第三步:测试部分英语卡片识别,建立需要精确识别的单词列表文件

我们在第二步中使用百度云文字普通识别出了测试图片的大部分单词,但是发现有一些识别不正确,我们需要用精确识别出这部分单词并代替错误的单词信息。

第二步得到的列表如上图,我们可以看到有些单词明显不正确,比如 (‘g’, 1), (‘b’, 1)等,我们需要找到这些单词的绝对路径,并保存在文件中,以用来精确识别。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import pickle
import sys
try:
with open('E:\ICE AND FIRE\sumwords.pkl', 'rb') as fa: #导出sumwords的字典
sumwords = pickle.load(fa)
except:
print('对不起,sumwords.pkl文件不存在.')
sys.exit() #如果文件不存在就退出程序

try:
with open('E:\ICE AND FIRE\wordsroot.pkl', 'rb') as fb: #导出wordsroot的字典
wordsroot = pickle.load(fb)
except:
print('对不起,wordsroot.pkl文件不存在.')
sys.exit()

listwords = list(wordsroot.values()) #导出所有图片单词的单词汇总列表,包括重复出现的单词
listroots = list(wordsroot.keys()) #导出所有单词对应的图片的绝对路径


listsort = sorted(sumwords.items(), key=lambda x:x[1], reverse=True) #把sumsords列表排序

try: #如果已经有统计需要精确识别单词的文件就直接读取
with open('E:\ICE AND FIRE\listaccurate.pkl', 'rb') as f1:
listaccurate = pickle.load(f1) #导出精确识别单词绝对路径列表

except: #如果没有就新建一个空的列表,把准备精确识别的单词绝对路径存储在列表中,并保存在二进制文件中
listaccurate = []

for each in listsort:

word = each[0] #这个单词
if len(word) in [1, 2] or word in ['/ fali/', 'grIp', 'uer']: #我们发现一些错误识别的例子,长度很短(只有一两个字母),或者其他例子
print(word) #打印出这些错误单词
wordtime = each[1] #这个单词出现的次数
start = 0

#为了找到这个单词每次出现的图片绝对路径,我们先把单词在listwords中的索引找到,因为在listroots里面
#同样的索引对应着单词的绝对路径
while wordtime:
start = listwords.index(word, start) #index第一个参数是查找对象,第二个参数是从哪一个索引开始查找
proot = listroots[start] #找到这个单词对应的路径
wordsroot.pop(proot) #在wordsroot里面删除没有精确识别的路径和单词
print('删除wordsroot中单词%s的路径%s.' % (word, proot))
listaccurate.append(proot) #由于百度文字识别高精度500的限制,所以要先用普通识别把没有识别的在用精度识别,
#所以我们在这里用listaccurate把没有识别好的图片路径保存起来,再用精度识别。
start += 1 #再从下一个索引开始查找
wordtime -= 1 #直到查找完这个单词的所有在listwords中的索引
with open('E:\\ICE AND FIRE\\listaccurate.pkl', 'wb') as g:
pickle.dump(listaccurate, g)
sumwords.pop(word) #在sumwords字典中删除没有精确识别的单词和统计数

with open('E:\ICE AND FIRE\sumwords.pkl', 'wb') as f:
pickle.dump(sumwords, f)
with open('E:\ICE AND FIRE\wordsroot.pkl', 'wb') as f2:
pickle.dump(wordsroot, f2)



listsort = sorted(sumwords.items(), key=lambda x:x[1], reverse=True) #把sumsords列表排序

listsorted = [i for i in listsort if i[1]>=1] #运用列表解析式找到出现过四次及以上次数的单词,这里是测试用,所以用>=1, 正式运行用>=4
print(listsorted)

运行结果如下:

可以看出我们已经找到需要删除的单词的绝对路径,然后从之前的统计列表中删除,这些绝对路径保存在listaccurate列表里面并保存在listaccurate.pkl文件中

一个要点:return只能出现在包括try, except语句的函数中,不能单独在主程序中的try, except语句。

第三步我们找到了需要精确识别的单词绝对路径并保存在文件中,下面我们就需要用精确识别找到这些单词,并更新原来的两个统计列表。

未完待续。。。。