Python运行时错误:输入序列



我尝试用印尼语运行NER

我读过一些参考资料,他们说BERT模型只对前512个子符号进行了位置嵌入。因此,该模型无法处理较长的序列。我不能将文本截断为512,因为在这种情况下会丢失信息。

还有一个长序列的模型,名称是"Longformers"。但我不能使用这个模型,因为来自deeppavlov的实体比它更完整

此外,我发现Pytorch错误的滑动窗口方法";RuntimeError:索引超出范围:试图访问表外511行的索引512";,但我不知道如何在NER用例中实现它。

你能帮我怎么处理吗?

输入为pandas.core.series.series'df'

与其他具有可以潜在扩展的分析计算位置嵌入的Transformer不同,BERT中的位置嵌入是与模型联合训练的,因此无法估计如果BERT有更长的输出,它会学到什么。

如果你想使用BERT,你别无选择,只能将输入文本分割成最多512个子单词长的分段文本。从你的例子来看,你的输入文本似乎由多个句子组成。在使用BERT处理文本之前,你肯定应该将文本拆分成句子(例如,SpaCy可以进行相当不错的句子拆分(,BERT是在句子级别预先训练的。如果句子拆分没有帮助(即,句子仍然太长(,你可以提供一些关于如何进一步拆分句子的启发(基于标点符号或类似的东西(。

我非常怀疑你的数据是否具有这样的性质,以至于你永远无法将其分割成更小的片段。如果是,你应该训练一个不同的模型,比如LSTM-CRF。但我认为,对文本进行分割的危害远小于使用BERT表示的好处。

实际上,我不确定这是否会对印尼净入学率产生影响,但通常你不想简单地拆分文本。建议使用滑动窗口方法,在"简单"拆分的边缘保留单词的上下文。

我也不喜欢那些涵盖了你所有复杂性的框架,因为你想做的任何事情,如果没有实现,都很难实现。通常,您只需修改一个方法,就可以让代码的其余部分来实现滑动窗口拆分。使用deeppavlov似乎并不那么容易,因为在本期中,他们建议在使用管道(他们称之为链(处理文档之前检查文档的长度。

请看下面的评论示例:

from bert_dp.tokenization import FullTokenizer
#we can use only 510 for our text because they are adding special tokens
maxtokens = 509
startOffset = 0
docStride = 200
#The location of your vocabulary file is probably different
#You can see the download location when you run:
#ner_model = build_model(configs.ner.ner_ontonotes_bert_mult, download=True)
tokenizer = FullTokenizer(vocab_file='/root/.deeppavlov/downloads/bert_models/multi_cased_L-12_H-768_A-12/vocab.txt', do_lower_case=False)
ok_doc = 'Limnologi mempelajari perairan di daratan Mamalogi mempelajari mamalia Mikrologi meneliti organisme mikroskopik dan interaksinya dengan kehidupan lainnya Mikologi mempelajari fungi Neurosains Neurobiologi mempelajari sistem saraf termasuk anatomi fisiologi dan patologinya Ornitologi mempelajari burung Paleontologi mempelajari fosil dan bukti Geografis kehidupan prasejarah Patologi Patobiologi atau patologi meneliti penyakit seperti penyebab proses ciri dan perkembangannya Parasitologi mempelajari parasit dan parasitisme Penelitian biomedis meneliti tubuh manusia yang sehat dan sakit Psikobiologi mempelajari dasar psikologi secara biologis Sosiobiologi mempelajari dasar sosiologi secara biologis Teknik biologis mempelajari biologi dari sudut pandang teknik dan lebih menekankan pada pengetahuan terapan Bidang ini terkait dengan bioteknologi Virologi mempelajari virus dan agen yang seperti virus Zoologi mempelajari hewan termasuk klasifikasi fisiologi perkembangan dan perilaku Bali adalah sebuah provinsi di Indonesia yang ibu kota provinsinya berNamaa Kota Denpasar Denpasar Bali juga merupakan salah satu pulau di Kepulauan Nusa Tenggara Di awal kemerdekaan Indonesia pulau ini termasuk dalam Provinsi Sunda Kecil yang beribu kota di Singaraja dan kini terbagi menjadi 3 provinsi Bali Nusa Tenggara Barat dan Nusa Tenggara Timur Selain terdiri dari Pulau Bali wilayah Provinsi Bali juga terdiri dari pulau-pulau yang lebih kecil di sekitarnya yaitu Nusa PenidaPulau Nusa Penida Nusa LembonganPulau Nusa Lembongan Nusa CeninganPulau Nusa Ceningan Pulau Serangan dan Pulau Menjangan Secara Geografis Bali terletak di antara Pulau Jawa dan Pulau Lombok Mayoritas puduk Bali adalah pemeluk agama Hindu Di dunia Bali terkenal sebagai tujuan pariwisata dengan keunikan berbagai hasil seni-budayanya khususnya bagi para wisatawan Jepang dan Australia Bali juga dikenal dengan julukan Pulau Dewata dan Pulau'
to_long_doc = ok_doc + ' Limnologi mempelajari ' + ok_doc 
docs = [ok_doc, to_long_doc]
def lenDocTokens(docTokens):
length = sum([l for w,t,l in docTokens])
return length
docsAfterSlidingWindow = []
for doc in docs:
#tokenize your text
docTokens = [(w, tokenizer.tokenize(w)) for w in doc.split()]
docTokens = [(w, t, len(t)) for w,t in docTokens]
print('doctTokens :{}'.format(lenDocTokens(docTokens)))
while startOffset < lenDocTokens(docTokens):
length = min(lenDocTokens(docTokens) - startOffset, maxtokens)

slidingWindowDoc = []
counter = 0
#reconstructing the document
for token in docTokens:
counter += token[2]
if (counter > startOffset+length):
break
elif (counter >= startOffset):
b.append(token)
slidingWindowDoc.append(token[0])
docsAfterSlidingWindow.append(' '.join(slidingWindowDoc))
#stop when the whole document is processed (document has less than 512
#or the last document slice was processed)
if startOffset + length == lenDocTokens(docTokens):
break
startOffset += min(length, docStride)
startOffset = 0
print([len(tokenizer.tokenize(s)) for s in docsAfterSlidingWindow])

您可以看到,第二个文档被拆分为3个序列:输出:

doctTokens :447
doctTokens :902
[447, 508, 508, 503]

最新更新