文档相似性运行时超出了使用Spacy的范围

问题描述

我已经用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之类的位置,以便可以近似查找。