У меня есть три списка: «цели», «контексты» и «метки». Я перебираю список и пытаюсь удалить строки в списках «target» и «context», где эквивалентная строка в «метках» равна 0. Но, когда я пытаюсь удалить строку в моих «contextx» list, Numpy жалуется, что того, что должно быть в этой строке, не существует.
import json
import numpy as np
import pandas as pd
import os
assert os.path.isfile("train-v1.1.json"),"Non-existent file"
from tensorflow.python.client import device_lib
import tensorflow.compat.v1 as tf
#import keras
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import re
regex = re.compile(r'\W+')
#Reading the files.
def readFile(filename):
with open(filename) as file:
fields = []
JSON = json.loads(file.read())
articles = []
for article in JSON["data"]:
articleTitle = article["title"]
article_body = []
for paragraph in article["paragraphs"]:
paragraphContext = paragraph["context"]
article_body.append(paragraphContext)
for qas in paragraph["qas"]:
question = qas["question"]
answer = qas["answers"][0]
fields.append({"question":question,"answer_text":answer["text"],"answer_start":answer["answer_start"],"paragraph_context":paragraphContext,"article_title":articleTitle})
article_body = "\\n".join(article_body)
article = {"title":articleTitle,"body":article_body}
articles.append(article)
fields = pd.DataFrame(fields)
fields["question"] = fields["question"].str.replace(regex," ")
assert not (fields["question"].str.contains("catalanswhat").any())
fields["paragraph_context"] = fields["paragraph_context"].str.replace(regex," ")
fields["answer_text"] = fields["answer_text"].str.replace(regex," ")
assert not (fields["paragraph_context"].str.contains("catalanswhat").any())
fields["article_title"] = fields["article_title"].str.replace("_"," ")
assert not (fields["article_title"].str.contains("catalanswhat").any())
return fields,JSON["data"]
trainingData,training_JSON = readFile("train-v1.1.json")
print("JSON dataset read.")
#Text preprocessing
## Converting text to skipgrams
print("Tokenizing sentences.")
strings = trainingData.drop("answer_start",axis=1)
strings = strings.values.flatten()
textTokenizer = Tokenizer()
textTokenizer.fit_on_texts(strings)
questionsTokenized_train = pad_sequences(textTokenizer.texts_to_sequences(trainingData["question"]))
print(questionsTokenized_train.shape)
contextTokenized_train = pad_sequences(textTokenizer.texts_to_sequences(trainingData["paragraph_context"]))
print("Sentences tokenized.")
from tensorflow.keras.preprocessing.text import *
from tensorflow.keras.preprocessing.sequence import skipgrams,make_sampling_table
def skipgrams_labels(sequence,vocabulary_length,window_size=3):
try:
couples,labels = skipgrams(sequence,vocabulary_length,window_size=window_size)
assert len(couples) > 0
target_word,context = zip(*couples)
return np.array([target_word,context,labels]).T
except Exception as e:
raise ValueError("Exception in skipgrams_labels")
def positive_skipgrams(sequence,vocabulary_length,window_size=3):
targets,contexts,labels = skipgrams_labels(sequence,vocabulary_length,window_size=3)
for target,context,label in zip(targets,contexts,labels):
if (label == 0):
targets = np.delete(targets,target)
contexts = np.delete(contexts,context)
return targets,contexts
Ошибка:
----------- -------------------------------------------------- -------------- IndexError Traceback (последний вызов был последним) в () ----> 1 question_skipgrams_train = [positive_skipgrams (sequence, vocabulary_length) для последовательности в questionsTokenized_train]
в (.0) ----> 1 question_skipgrams_train = [Positive_skipgrams (sequence, vocabulary_length) для последовательности в questionsTokenized_train]
в Positive_skipgrams (sequence, vocabulary_length, window_size) 4 if (label == 0): 5 целей = np.delete (цели, цель) ----> 6 контекстов = np.delete (контексты, контекст) 7 возвращаемых целей, контексты
~ / anaconda3 / envs / tenorflow_p36 / lib / python3 0,6 / сайт-пакеты / ню mpy / lib / function_base.py в delete (arr, obj, axis) 4374 повысить IndexError (
4375 "index% i выходит за пределы для оси% i с" -> 4376 "size% i"% (obj, ось, N)) 4377 if (obj <0): 4378 obj + = N </p>
IndexError: индекс 44086 выходит за пределы оси 0 с размером 132
Не знаю Я не понимаю, почему здесь что-то не так. Это похоже на странную ошибку, потому что NumPy должен был найти элемент - иначе почему бы для l oop не быть с ошибкой?
Я даже заменил функция skipgrams_labels с жестко закодированными значениями, указывающими, что с функцией должно быть что-то не так.
Что вы рекомендуете делать вместо этого?