Программа, которую я создаю, представляет собой попытку точного анализа настроений в твитах относительно несчастных случаев авиакомпаний. Он должен принимать твит, прогнозировать его как нейтральный, положительный или отрицательный. Если твит предсказан как отрицательный, он должен предсказать, если отрицательная причина вызвана обслуживанием клиентов.
Я уже обучил нейронные сети делать это. Сейчас я пытаюсь преобразовать необработанные данные в формат, понятный нейронным сетям. Две нейронные сети имеют разные словари в виде частотных распределений.
Мне нужно взять необработанный твит (в данном случае просто строку), удалить бессмысленные слова, а затем ввести очищенный твит в оба импортированных кадра данных, чтобы получить числа, понятные нейронным сетям.
Импортированные фреймы данных имеют формат:
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
с соответствующим (строковым) целым числом, у меня все будет в порядке.
Я попробовал это, но не смог найти способ об этом.
Я не беспокоюсь об эффективности сейчас, я просто хочу сделать это доказательство концепции. Я сейчас в полном недоумении. Я не знаю, как продолжить.
Спасибо, еще раз.