как сделать одну горячую кодировку для текста в абзаце на уровне предложения? - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть предложения, хранящиеся в текстовом файле, который выглядит следующим образом.

radiologicalreport =1.  MDCT OF THE CHEST   History: A 58-year-old male, known case lung s/p LUL segmentectomy.  Technique: Plain and enhanced-MPR CT chest is performed using 2 mm interval.  Previous study: 03/03/2018 (other hospital)  Findings:   Lung parenchyma: The study reveals evidence of apicoposterior segmentectomy of LUL showing soft tissue thickening adjacent surgical bed at LUL, possibly post operation.

Моя конечная цель - применить LDA для классификации каждого предложения по одной теме.Перед этим я хочу сделать одну горячую кодировку текста.Проблема, с которой я сталкиваюсь, заключается в том, что я хочу по одному горячему кодированию для каждого предложения в массиве numpy, чтобы иметь возможность передавать его в LDA.Если мне нужно одно горячее кодирование полного текста, я могу легко сделать это, используя эти две строки.

sent_text = nltk.sent_tokenize(text)
hot_encode=pd.Series(sent_text).str.get_dummies(' ')

Однако моя цель состоит в том, чтобы одно горячее кодирование на предложение в массиве-пустышке.Итак, я пытаюсь следующий код.

from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
import nltk
import pandas as pd


from nltk.tokenize import TweetTokenizer, sent_tokenize

with open('radiologicalreport.txt', 'r') as myfile:
report=myfile.read().replace('\n', '') 
tokenizer_words = TweetTokenizer()
tokens_sentences = [tokenizer_words.tokenize(t) for t in 
nltk.sent_tokenize(report)]
tokens_np = array(tokens_sentences)

label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(tokens_np)

# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)

onehot_encoded = onehot_encoder.fit_transform(integer_encoded)

Я получаю сообщение об ошибке в этой строке как "TypeError: unhashable type: 'list'"

integer_encoded = label_encoder.fit_transform(tokens_np)

И, следовательно, не может продолжаться дальше.Кроме того, мои tokens_sentences выглядят так, как показано на изображении enter image description here.

Пожалуйста, помогите !!

1 Ответ

0 голосов
/ 24 февраля 2019

Вы пытаетесь преобразовать метки в числовые значения, используя fit_transform (в вашем примере метки представляют собой списки слов - tokens_sentences).

Но нечисловые метки могут быть преобразованы, только если они может быть сопоставимо (см. документы ).Списки не могут быть хешируемыми, но вы можете преобразовать их в кортежи:

tokens_np = array([tuple(s) for s in tokens_sentences]) 
# also ok: tokens_np = [tuple(s) for s in tokens_sentences]

, а затем вы можете закодировать свои предложения в integer_encoded

label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(tokens_np)
...