multiprocessing.pool.MaybeEncodingError: 发送结果时出错



索蒙可以解释一下下面的错误吗?

multiprocessing.pool.MaybeEncodingError: 发送结果时出错: '[>]'.
原因: 'NotImplementError("[E112] 不支持酸洗跨度, 因为跨度只是父文档的视图,不能存在于其 有。腌制的跨度总是必须包括它的 Doc 和词汇, 与腌制父文档相比几乎没有缺点 径直。因此,与其腌制跨度,不如腌制它所属的文档 或Span.as_doc将 span 转换为独立的 Doc 对象。

下面是我的代码:

resume_parser2.py

class Resume_parser2(object):
inputString = ''
skill = ['Java']
def __init__(self, resume):
self.__matcher = Matcher(nlp.vocab)
self.__skills = {
'skills'    : None
}
self.__text        = utils.extract_text(self.__resume, os.path.splitext(self.__resume)[1])
self.__text        = ' '.join(self.__text.split())
self.__nlp         = nlp(self.__text)
self.__noun_chunks = list(self.__nlp.noun_chunks)

def __get_basic_details(self):
skills = utils.extract_skills(self.__nlp,self.__noun_chunks)
self.__skills['skills'] = skills
return
def check_skills(self):
skill = ['Java']
if skill in self.__skills:
return self.__skills
def filtered_resume(resume):
parser = Resume_parser2(resume)
return parser.check_skills
if __name__ == '__main__':
pool = mp.Pool(mp.cpu_count())
resumes = []
data = []
for root, directories, filenames in os.walk('resumes'):
for filename in filenames:
file = os.path.join(root, filename)
resumes.append(file)
results = [pool.apply_async(filtered_resume, args=(x,)) for x in resumes]
results = [p.get() for p in results]

utils.extract_text是定义为从文件中提取文本的函数,utils.extract_skills是从文件中提取技能组。这两者都是提取数据。

Api.py

from resume_parser2 import Resume_parser2
from flask import Flask, request, redirect, url_for,send_from_directory, jsonify
from werkzeug.utils import secure_filename
import json
import multiprocessing as mp
import pandas as pd
import os
direct = 'E:/parsertool/backupresumes'
app = Flask(__name__)
def print_cyan(text):
print("33[96m {}33[00m" .format(text))
def extract_from_directory(directory):
if os.path.exists(directory):
pool = mp.Pool(mp.cpu_count())
resumes = []            
for root, directories, filenames in os.walk(directory):
for filename in filenames:
extension = os.path.splitext(filename)[1]
if (extension == '.pdf' or extension == '.docx'):
file = os.path.join(root, filename)
resumes.append(file)
results = pool.map(filtered_resume, resumes)
pool.close()
pool.join()
return results
else:
return 'Directory not found.'

def filtered_resume(resume):
parser = Resume_parser2(resume)
return parser.check_skills

@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
#files = request.files.getlist('files')
#folder = dirname(files[0].filename)
#print(folder)
return jsonify(extract_from_directory(direct))

if __name__ == '__main__':
app.run(debug=True)

在这里我无法理解错误。有人可以解释一下该错误是什么或如何解决它吗?

错误消息非常有用。在代码中的某个位置,您尝试使用 pickle 来保存包含跨度的对象。这些跨度可能是从尝试将self.__noun_chunks = list(self.__nlp.noun_chunks)的结果转换为字符串self.__nlp = nlp(self.__text)生成的,可能是这样的self.__noun_chunks = [str(x) for x in self.__nlp.noun_chunks]

还可以使用调试器检测包含跨度的其他对象,然后尝试使用 pickle 转储它们。

该代码有点复杂,所以我没有尝试重现,但首先尝试更改:

def filtered_resume(resume):
parser = Resume_parser2(resume)
return parser.check_skills

to(请注意第 3 行末尾添加的括号(:

def filtered_resume(resume):
parser = Resume_parser2(resume)
return parser.check_skills()

更长(可能(的解释:

Python pickles(本质上是序列化(进程之间传递的任何数据。因此,在这种情况下,从filtered_resume返回的结果在返回到原始进程之前会被腌制。

我猜,如果没有return parser.check_skills末尾的括号,filtered_resume函数将返回方法check_skills而不是调用它并返回结果(self.__skills(。因此,Python试图腌制check_skills函数。酸洗方法应该没问题,但是这个方法需要酸化整个Resume_parser2对象(至少因为它包含对self的显式引用,可能是因为Python无论如何都会酸菜对象,因为check_skills是对象的一部分(。

酸洗对象,就像方法一样,应该没问题。但是,如果nlp是对spaCy对象的引用(我猜是这样(,那么你就会开始遇到腌制spaCy对象带来的一些奇怪之处。同样,我只是猜测,但我假设__noun_chunks是由spaCy生成的一组跨度,因此当Resume_parser2对象被腌制时,它会尝试腌制__noun_chunks并且spaCy抱怨因为它们是跨度。

如果您进行了我上面建议的更改,它应该只是尝试腌制__skills变量,并且假设它不包含跨度,它应该可以很好地腌制。但是,如果这不起作用,则必须更新代码以摆脱跨度或将它们转换为spaCy文档(如错误消息本身所述(...当我们来到那座桥时,我们可以越过它。

相关内容

  • 没有找到相关文章

最新更新