关于爬虫
选了知乎做来源, 在未知的情况下选了一个硬骨头。知乎的反扒机制并不是不了解前端 开发的人可以自主编码突破的(详见x-zes-96加密)。直接使用八爪鱼爬回答内容,评论api还能调用就自己写request了。
下载图片的时候需要注意图片格式,常见是jpg,而gif、webp等不是直接可以使用ocr的格式,需要使用正则排除或格式转换。
文本预处理
中文编码使用utf-8。python中字符串加载格式是Unicode,必须通过Unicode编码删除特殊字符,以防后期分句分词出现bug。Unicode编码删除特殊字符前必须先正则删除链接和html标签。
def illegal_char(s):
s = re \
.compile( \
u"[^"
u"\u4e00-\u9fa5"
u"\u0041-\u005A"
u"\u0061-\u007A"
u"\u0030-\u0039"
u"\u3002\uFF1F\uFF01\uFF0C\u3001\uFF1B\uFF1A\u300C\u300D\u300E\u300F\u2018\u2019\u201C\u201D\uFF08\uFF09\u3014\u3015\u3010\u3011\u2014\u2026\u2013\uFF0E\u300A\u300B\u3008\u3009"
u"\!\@\#\$\%\^\&\*\(\)\-\=\[\]\{\}\\\|\;\'\:\"\,\.\/\<\>\?\/\*\+"
u"]+") \
.sub('', s)
return s
动态正则匹配使用re.escape()
过长的文本需要截断:
// An highlighted block
def sent_split(text):
sts = ['']
allsentences = ['']
sigments = re.findall('.{300}', text)
for i in sigments:
i = sts[-1] + i
sts = StnSplit().split(i) //调用分句模型
allsentences.pop(-1)
allsentences.extend(sts)
allsentences = list(filter(None, allsentences))
return allsentences
句子太多(列表太长)需要make batch:
BATCH_SIZE = 32
def makebatch(list):
batchlist = []
numbatch = len(list) // BATCH_SIZE
for p in range(numbatch):
batchlist.append(list[BATCH_SIZE * p:BATCH_SIZE * p + BATCH_SIZE])
batchlist.append(list[numbatch * BATCH_SIZE:len(list)])
return batchlist
删除列表元素使用filter()不要使用remove、del等,索引会乱