调用百度分词api总结

在触电实习了将近一个月,体验了一把作为程序员的生活,其中印象最深的就是每天早上对昨天的工作进行总结,这是一个不错的督促自己不断学习进步的方法,也便于大家了解你的工作进度,以便于安排接下来的工作,大家还可以交流工作中遇到的各种问题,集思广益去解决它。以后的学习或者工作生活中也可以继续保持这一良好习惯,对自己的学习或者工作生涯也会有很大的帮助。
刚来的几天一直是由涛哥带着我写代码,调用百度的词法分析api进行分词。由于在学校中的实际操作机会不多,在编写代码的过程中出现了许多问题,例如生僻字api无法进行分析返回值为空,不可预知的报错,字符串形式有误,词汇量太大无法进行分词等,这些问题也导致我浪费了不少时间,但在涛哥的指导下,我还是一一将这些坑填平。
在遇见生僻字时,一开始的解决方案是遇见这种类型就跳过,但后来仔细想想,生僻字毕竟只有几个,因为几个生僻字导致一篇文章不能用还是不好,所以我在百度上找到了汉字,英文,数字的unicode编码范围之后,采用了正则匹配,将不是汉字、英文字母、数字的字符全部替换为空,这样也能有效的避免之后再遇见特殊字符。代码如下:
p=re.compile(r’[^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a]’)#正则匹配
在代码运行的过程中也许会因为种种原因报错,然而可能只是因为一个很小的问题,只需要重启一下就可以了,所以为了能让代码长久的跑起来,我使用了try except的方法来捕捉错误,在系统报错之后,重新尝试代码,不再直接退出程序。
字符串的问题由于是文本本身格式有误,导致api的返回值为空,在执行 del text 时就会报错,这时用一个判断语句
if ‘error_code’ in text_dict.keys():
来进行判断,如果是则舍弃这一条,不再写入文件。
百度对分词的文本长度也进行了限制,太长的文本也会导致返回值为空进而报错,于是在涛哥的指导下,我选择了先设置一个最大值imax,然后在调用api之前判断字符床是否大于imax,如果大于则将其以一段长度为4000来进行切割,分开调用之后再进行拼接。随后又出现了新的问题,有的文本正好长度为4000,但因为文本在写入时其末尾有个换行符,百度无法识别,所以在调api之前先用个strip()函数去掉换行符,之后又发现有情况为文本长度为8001,但最后一个是标点符号,于是在调api之前采用正则表达式将符号替换掉。最终代码如下:
def word_cor(filename,file,n):
try:
time.sleep(0.5)
for x in range((int(len(file) / 4000) + 1)):
word = ‘’.join(file[4000 * x:4000 * (x + 1)])
if x == 0:
w = word.strip().split(r’|’)
w[1] = re.sub(p, ‘’, str(w[1]))
w[2] = re.sub(p, ‘’, str(w[2]))
text = ‘’.join(w[1] + w[2])
text_dict1 = client.lexer(text)
if ‘error_code’ in text_dict1.keys():
break
else:
text_dict1[‘news_pk’] = w[0]
time.sleep(0.5)
news_pk = w[0]
else:
w = word.strip()
w = re.sub(p, ‘’, w)
if w != ‘’:
time.sleep(0.5)
text_dicts = client.lexer(w)
if ‘error_code’ in text_dicts.keys():
pass
else:
text_dict1[‘items’].extend(text_dicts[‘items’])
else:
pass
if ‘error_code’ in text_dict1.keys():
pass
else:
try:
del text_dict1[‘text’]
except:
print(text_dict1)
del text_dict1[‘log_id’]
for x in text_dict1[‘items’]:
del x[‘loc_details’]
del x[‘uri’]
with open(filename + ‘.json’, ‘a+’, encoding=‘utf-8’) as y:
y.write(json.dumps(text_dict1, ensure_ascii=False) + “\n”)
y.close()
take_notes(filename, n, news_pk)
print(“本次分析执行至 {}第{}行”.format(filename, n))
except Exception as z:
print(“代码运行至{}文件第{}行。”.format(filename, n))
print(z)
print(type(z))
with open(r"C:/Users/heyijie/Desktop/record/error_record", ‘a+’, encoding=‘utf-8’) as e:
e.write("’{}’".format(filename) + “:” + “{}”.format(n) + “\n”)
e.close()
write_in()
因为百度对用户调用api的qps有限制,所以一般都要用sleep来控制程序的调用次数,但由于文本长短不一,有的甚至还不超过50,都设置同一个时间如果时间太长代码效率就会慢,如果太短,代码又会频繁报错,所以我用了一个变量tm来设置时间,在执行程序之前先判断字符串的长度,然后根据长度设置sleep的时间,这样就能最大限度的调用api且不报错。代码如下:
if len(word) > 800:
tm = 0.3
elif 50 < len(word) <= 800:
tm = 0.5
elif len(word) <= 50:
tm = 1

这次的编程不仅将学到的东西学以致用,还学到了不少的新东西,有些简单的东西我也容易想的复杂化。更重要的是,在涛哥的指导下,我知道了写日志的重要性,因为之前在学校动手的机会很少,所以压根没有写日志这个说法,在写了日志之后,找错,改错就变得简单多了,这也是一个很好的习惯,需要继续保持

你可能感兴趣的:(调用百度分词api总结)