Как сопоставить столбец DataFrame с входным столбцом DataFrame для панд трансформации - PullRequest
0 голосов
/ 12 июня 2019

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

Я уже обучил нейронные сети делать это. Сейчас я пытаюсь преобразовать необработанные данные в формат, понятный нейронным сетям. Две нейронные сети имеют разные словари в виде частотных распределений.

Мне нужно взять необработанный твит (в данном случае просто строку), удалить бессмысленные слова, а затем ввести очищенный твит в оба импортированных кадра данных, чтобы получить числа, понятные нейронным сетям.

Импортированные фреймы данных имеют формат:

                word        Frequency     word_index
0               flight      4742          1
1                   wa      1670          2
2                thank      1666          3
3                  get      1606          4
4                  thi      1369          5
5                 http      1200          6
6                 hour      1125          7
7                 help      1038          8
8               cancel      1034          9
9               servic       985         10
10               delay       980         11
11                time       952         12
12              custom       928         13
13                call       769         14
232            terribl       108         231
387                aw        65          386
468            absolut       52          467
483               hate       49          482 

Предварительная обработка твита:

The customer service was awful. Absolutely terrible. I hated it.

Постобработка твита:

    words
0   custom
1   servic
2       wa
3       aw
4  absolut
5  terribl
6     hate

Мне нужен этот твит для сопоставления с:

[9, 10, 2, 386, 467, 231, 482]

Я пробовал использовать функцию map () в дополнение к функции «поиск и замена», но никак не мог найти ее.

import numpy as np
import pandas as pd
import nltk
import tensorflow as tf

from nltk.stem import PorterStemmer
from nltk.corpus import stopwords
from sklearn.model_selection import train_test_split
from tensorflow import keras

nltk.download('stopwords')
nltk.download('punkt')

WordDistInit = pd.read_csv('WordDistDenseInit.csv')
WordDistSeco = pd.read_csv('WordDistDenseSeco.csv')
WordDistInit.columns=['word', 'Frequency', 'word_index']
WordDistSeco.columns=['word', 'Frequency', 'word_index']
print("Data loaded")
#DOWNLOAD TWEET HERE
tweet=["The customer service was awful. Absolutely terrible. I hated it."]

#Finds word stems -- Running, runner, run - > Run.
stemming = PorterStemmer()
#Removes "stopwords", words that generally don't add anything to a sentence. e.g. "The".
stops = set(stopwords.words("english"))

#Defines enclosing cleaning function. May optimize in future.
def apply_cleaning_function_to_list(X):
    cleaned_X = []
    for element in X:
        cleaned_X.append(clean_text(element))
    return cleaned_X

#Defines nested cleaning function. Actually does the "work".
def clean_text(raw_text):
    #Removes uppercase.
    text = raw_text.lower()
    #Converts text into list of words.
    tokens = nltk.word_tokenize(text)
    #Removes puncuation and numbers.
    token_words = [w for w in tokens if w.isalpha()]
    #Stems words.
    stemmed_words = [stemming.stem(w) for w in token_words]
    #Removes stopwords.
    meaningful_words = [w for w in stemmed_words if not w in stops]
    #Returns cleaned data.
    return meaningful_words

print("Cleanup function defined without error.")

#Define text-to-clean
text_to_clean = tweet
#Cleans text
tweet_cleaned = apply_cleaning_function_to_list(text_to_clean)
#Flattens list
flat_tweet = [item for sublist in tweet_cleaned for item in sublist]

#create new df 
df_init, df_seco = pd.DataFrame({'words':flat_tweet}), pd.DataFrame({'words':flat_tweet})

print("Text-clean function called without error.")

Преобразованный твит нужен в следующем блоке кода - для анализа первой нейронной сетью.

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

Заранее спасибо.

EDIT:

Я превратил твит в строку:

Y = ', '.join(flat_tweet)
print(Y)
custom, servic, wa, aw, absolut, terribl, hate

и я превратил WordDistInit в словарь, удалил целые числа и заменил их строками:

#Function to convert text to numbers.
#Cutoff_for_rare_words removes words only used once.
def training_text_to_numbers(text, cutoff_for_rare_words = 1):
    #Convert Pandas format to dictionary
    word_dict = WordDistInit.word.to_dict()
    #Converts ints into strs
    word_dict = dict((str(k),v) for k,v in word_dict.items())

Это означает, что у меня есть словарь в формате:

{'0': 'flight', '1': 'wa', '2': 'thank', '3': 'get', '4': 'thi', '5': 'http', '6': 'hour', '7': 'help', '8': 'cancel', '9': 'servic', '10': 'delay', '11': 'time', '12': 'custom', '13': 'call', '14': 'bag', '15': 'wait', '16': 'plane', '17': 'need', '18': 'fli', '19': 'hold', '20': 'amp', '21': 'us', '22': 'go', '23': 'would', '24': 'whi', '25': 'tri', '26': 'one', '27': 'still', '28': 'pleas', '29': 'airlin', '30': 'day', '31': 'ca', '32'...}

Если я могу просто сопоставить все слова переменных Y с соответствующим (строковым) целым числом, у меня все будет в порядке.

Я попробовал это, но не смог найти способ об этом.

Я не беспокоюсь об эффективности сейчас, я просто хочу сделать это доказательство концепции. Я сейчас в полном недоумении. Я не знаю, как продолжить.

Спасибо, еще раз.

1 Ответ

0 голосов
/ 13 июня 2019

Ниже приведен пример кода, который обычно решает мою проблему. Единственная проблема сейчас заключается в том, что если вводится значение, отсутствующее в словаре, возникает ошибка, но это решаемо.

lookup = {'0': 'flight', '1': 'wa', '2': 'thank', '3': 'get', '4': 'thi', '5': 'http', '6': 'hour', '7': 'help', '8': 'cancel', '9': 'servic', '10': 'delay', '11': 'time', '12': 'custom', '13': 'call', '14': 'bag', '15': 'wait', '16': 'plane', '17': 'need', '18': 'fli', '19': 'hold', '20': 'amp', '21': 'us', '22': 'go', '23': 'would', '24': 'whi', '25': 'tri', '26': 'one', '27': 'still', '28': 'pleas', '29': 'airlin', '30': 'day', '31': 'ca'}

flipped_lookup = {v:k for k,v in lookup.items()}
string_to_analyze = "custom, servic, wa, aw, absolut, terribl, hate"
list_to_analyze = [w.strip() for w in string_to_analyze.split(',')]
analyze_value_list = [int(flipped_lookup[w]) for w in list_to_analyze]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...