разреженная матрица вызывает код выхода ошибки сегментации 139

#scipy #segmentation-fault #sparse-matrix #gensim #exit-code

#scipy #ошибка сегментации #разреженная матрица #gensim #код выхода

Вопрос:

При работе с разреженной матрицей он резко завершает работу ядра и завершает код 139. Это произошло при работе с Gensim, который использует формат разреженной матрицы.

Сбой происходит при умножении матрицы на другую матрицу или даже при использовании matrix.sum() .

матрица была создана с использованием scipy:

 matrix = scipy.sparse.csc_matrix((data, indices, indptr), shape=(num_terms, num_docs), dtype=dtype)
  

Ответ №1:

Оказывается, форма матрицы (num_terms) не соответствует максимальному значению (индексам), что заставляет numpy делать ошибочные предположения об адресах памяти.

Этого можно легко избежать, если после создания матрицы мы вызываем:

 matrix.check_format()
  

который выполняет некоторые проверки работоспособности матрицы.
при использовании gensim просто используйте высокое значение num_features. Это не обязательно должно быть ваше фактическое количество функций, если оно не меньше фактического числа.

отредактируйте для получения более подробной информации:

с gensim вы можете работать над сходством документов, используя:

 sim_method = gensim.similarities.SparseMatrixSimilarity(documents, num_features=max_index)
  

если «документы» содержат идентификатор выше, чем max_index, это вызовет ошибку.

gensim просто оборачивает объект scipy sparse matrix. для вызова check_format для нее используйте:

 sim_method.index.check_format()
  

Хотя более вероятная ошибка может возникнуть, когда вы пытаетесь использовать этот метод подобия в другом корпусе документов, чтобы получить их оценки подобия.

 sim_method[query_documents]
  

опять же, если query_documents содержит идентификатор выше, чем max_index, указанный во время создания метода sim — это вызовет ошибку.

Здесь gensim полностью скрывает scipy-матрицу, поэтому вы не можете напрямую вызвать check_format, вам просто нужно проверить свой собственный ввод и убедиться, что там нет ошибки.

Комментарии:

1. Спасибо, что сообщили о проблеме: github.com/scipy/scipy/issues/9965

2. Актуальность для gensim была бы понятнее, если бы вы упомянули или показали, какой код gensim вы использовали. (Какому классу / методу вы можете предоставить num_features , чтобы избежать проблемы? И действительно ли это позволяет избежать каких-либо проблем, даже если матрица не пройдет check_format() тест?)

3. Верно, я добавил детали, чтобы прояснить проблему с gensim