Как мне удалить что-то из массива NumPy, перебирая его и несколько других массивов? - PullRequest
0 голосов
/ 07 января 2020

У меня есть три списка: «цели», «контексты» и «метки». Я перебираю список и пытаюсь удалить строки в списках «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 с жестко закодированными значениями, указывающими, что с функцией должно быть что-то не так.

Что вы рекомендуете делать вместо этого?

Ответы [ 2 ]

1 голос
/ 07 января 2020

Переменная target в for l oop является значением от targets, но np.delete() равна , ожидая, что вы передадите ей индекс (или фрагмент) для удаления. Текущее значение target 44086 выходит за границы массива targets, который содержит только 132 элемента на первой оси.

Обратите внимание на выделенную жирным шрифтом часть. np.delete() не предназначен для удаления определенного значения, он удаляет определенный индекс.

0 голосов
/ 08 января 2020

Правильный способ сделать то, что я хотел, это:

targets = targets[labels != 0]
contexts = contexts[labels != 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...