我正在尝试使用 spacy 为文章进行自定义 NER;但是当我开始训练模型时,我收到错误消息: “[E088] 长度为 1021312 的文本超出最大值 1000000....” 尝试了以下解决方案: 我。增加 nlp.max_length = 1500000 ii.使用spacy“en_core_web_lg”,然后禁用不相关的spacy nlp管道。 三.尝试过 nlp.max_length = len(txt) + 5000 四.更改配置文件中的 max_length v.nlp.max_length = len(文本) vi.用 ' 分割数据 ’并与空间重新结合。 (新行字符“ ” 用于创建新行。) doc = nlp.make_doc(" ".join(text.split(' ')))
但这一切都是徒劳。
我使用下面的代码。这对我有用。
import spacy
nlp = spacy.load('en_core_web_lg',disable=['parser', 'tagger','ner'])
nlp.max_length = 1198623
我解决这个问题的方法是分割文本,处理它然后像以前一样重新加入。在我的例子中,字符串位于 1 到 n 大小的列表中。
def split_elements(strings, limit):
result = []
original_positions = []
for i, string in enumerate(strings):
if len(string) > limit:
start = 0
while start < len(string):
end = min(start + limit, len(string))
result.append(string[start:end])
original_positions.append(i)
start = end
else:
result.append(string)
original_positions.append(i)
return result, original_positions
def rejoin_elements(split_strings, original_positions):
result = []
current_index = -1
current_string = ""
for i, string in enumerate(split_strings):
if original_positions[i] != current_index:
if current_string:
result.append(current_string)
current_index = original_positions[i]
current_string = string
else:
current_string += string
if current_string:
result.append(current_string)
return result
# Example usage
text = ["This is a very long string ... more than .", "Short one."]
limit = 999_999
# split the text into manageable chunks
split_text, original_positions = split_elements(text, limit)
nlp = spacy.load("en_core_web_sm")
for item in split_text:
doc = nlp(item)
# do stuff
# if wanted, put the text back to the original
original_text = rejoin_elements(split_text, original_positions)