问题描述
我已经用Python编写了一个函数来计算PDF页面之间的相似度,以返回最相似的页面映射。
函数获取输入文件和具有字典条目的列表,如: thumbnail = [{'page':1,'text':'strin1'},{'page':2,'text':'strin2'},...]
功能:
import PyPDF2
import spacy
filename2="file.pdf"
nlp = spacy.load('en_core_web_lg')
def checker(filename2,thumbnail):
object = PyPDF2.PdfFileReader(filename2)
NumPages = object.getNumPages()
specialCharacters = {ord(c): " " for c in "!@#$%^&*()[]{};:,./<>?\|`~-=_+"}
# extract text and do the search
output=[]
for i in range(0,NumPages):
temp_dict={}
Text = object.getPage(i).extractText().translate(specialCharacters)
Text=Text.replace('\n','')
for item in thumbnail:
sim= nlp(Text).similarity(nlp(item['text']))
if sim>0.98:
temp_dict['page_thumbnail'] = item['page']
temp_dict['page_file']=i+1
temp_dict['sim'] = sim
output.append(temp_dict)
return output
对于使用38页的PDF和使用Spacy列出的38个条目的PDF,这将花费很长时间。 关于如何使其可扩展性有任何建议吗?同样,主要目标是返回文档的页码(i)和相似度得分最高的匹配页在缩略图中(item ['page'])。
解决方法
您致电nlp
的次数过多,特别是NumPages * len(thumbnail)
次。每个电话都很昂贵。您需要提前打电话给您,这样您就不会重复打电话了。
执行此操作:
# do this right at the start of your function
tdocs = [nlp(ii['text']) for ii in thumbnail]
# ... later on ...
Text=Text.replace('\n','')
doc = nlp(Text)
for item,tdoc in zip(thumbnail,tdocs):
sim = doc.similarity(tdoc)
那应该使其更快。如果仍然不够快,则应预先计算向量并将它们存放在annoy之类的位置,以便可以近似查找。