Модель TFIDF создает NA при чтении с эластичного - PullRequest
0 голосов
/ 24 октября 2019

Я моделирую некоторый текст с Kmeans, используя модель TF-IDF, но у меня странное поведение, которое я не могу понять.

Позвольте мне дать вам более подробную информацию о процессе

  1. Чтение изasticsearch и загрузка его в кадр данных pandas
  2. Вычисление моей матрицы TF-IDF из одного из полей в кадре данных
  3. Вычисление моей модели kmeans с использованием матрицы TF-IDF

При выполнении этого процесса возвращаемый фрейм данных показывает несколько строк со значениями NAN в новом столбце kmeans. Однако этого не происходит, когда я изменяю процесс с помощью следующих дополнительных шагов:

  1. Чтение из эластичного поиска и загрузка его в кадр данных pandas
  2. Запись в CSV
  3. Считайте, что CSV в pandas dataframe
  4. Вычисление моей матрицы TF-IDF из одного из полей на кадре данных
  5. Вычисление моей модели kmeans с использованием матрицы TF-IDF

Я случайно узнал об этом "магическом" трюке CSV при отправке моего кода одному из моих пиров. Я предполагаю, что это как-то связано с какой-то кодировкой, но я не знаю, как это исправить. Извините, если название не было достаточно описательным. Было трудно выразить это хорошо одной строкой.

Вот мой код

import pandas as pd
import numpy as np
from datetime import datetime

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
from elasticsearch_dsl.connections import connections

import nltk
import re
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.stem import SnowballStemmer
import pickle
ps = SnowballStemmer('spanish')


client = Elasticsearch("cluster-rdlab.cs.upc.edu:50444")

s = Search(using=client, index='processed_news_20191021')

clean_text = pd.DataFrame(dict(d.to_dict(),**{'url_hashed': d.meta.id}) for d in s.scan())

#### HERE IS WHERE THE MAGIC HAPPENS #######
# If I omit this piece of code I will get NANs on the resulting dataframe
clean_text.to_csv('test.csv')
clean_text = pd.read_csv('test.csv')
############################################

def tokenize_dict(text):
    tokens = nltk.word_tokenize(text)
    stems = [ps.stem(token) for token in tokens if re.match("[a-zA-Z]\w", token)]
    return stems

tfidf_model= "models/tfidf_model.sav"
tfidf_pickle = pickle.load(open(tfidf_model, 'rb'))
result_tfidf = tfidf_pickle.transform(clean_text.body)

cluster_model = "models/kmeans_model.sav"
cluster_pickle = pickle.load(open(cluster_model, 'rb'))
result_cluster = cluster_pickle.predict(result_tfidf)
clean_text['cluster'] = pd.DataFrame({'cluster':result_cluster})

Я не думаю, что это имеет какое-либо отношение к модели kmeans, потому что я тожеиспользуя другие модели и по-прежнему получать те же строки с NAN

#sentiment
sentiment_model = "models/sentiment_model.sav"
sentiment_pickle = pickle.load(open(sentiment_model, 'rb'))
result_sentiment = sentiment_pickle.predict(result_tfidf)
clean_text['sentiment'] = pd.DataFrame({'sentiment':result_sentiment})

#Super vector machine
fake_model = "models/SVM_model_notbal.sav"
fake_pickle = pickle.load(open(fake_model, 'rb'))
result_fake2 = fake_pickle.predict_proba(result_tfidf)
clean_text['fake'] = pd.DataFrame({'fake2':list(result_fake2)})

Может кто-нибудь помочь? Спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...