Понимание классификации Hate-Speech с Python. В настоящее время застрял с "токенизацией" (TweetTokenizer) - PullRequest
0 голосов
/ 04 февраля 2020

Я все еще очень плохо знаком с Python, и для университетского проекта я делаю классификацию ненавистнических высказываний в твиттере. Я следовал различным руководствам о том, как настроить базовый c анализ настроений и т. Д. c, но сейчас я возвращаюсь к некоторому рабочему коду и начинаю строить на его основе. В настоящее время я пытаюсь использовать импорт «Tweet Tokenizer» от NLTK, чтобы применить его к моему набору данных твита, как часть подготовки моих данных к моделированию. Однако я получаю сообщение об ошибке:

    Traceback (most recent call last):
  File "C:/Users/Ben/Desktop/Python Projects/roboticsassignment/test.py", line 32, in <module>
    testing_clean = clean_text(test, "tweet")
  File "C:/Users/Ben/Desktop/Python Projects/roboticsassignment/test.py", line 30, in clean_text
    df[text_field] = df[text_field].apply(tt.tokenize)
  File "C:\Users\Ben\Desktop\Python Projects\roboticsassignment\venv\lib\site-packages\pandas\core\series.py", line 4045, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas/_libs/lib.pyx", line 2228, in pandas._libs.lib.map_infer
TypeError: tokenize() missing 1 required positional argument: 'text'

Мой код в его нынешнем виде выглядит следующим образом

import pandas as pd
import re
from sklearn.utils import resample
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import string
import nltk
from nltk.tokenize import TweetTokenizer as tt
import warnings


train = pd.read_csv('training.csv')
print("Training Set:"% train.columns, train.shape, len(train))
test = pd.read_csv('testing.csv')
print("Testing Set:"% test.columns, test.shape, len(test))

# Cleans the text from the datasets to remove special characters, to make for easier processing
def  clean_text(df, text_field):
    df[text_field] = df[text_field].str.lower()
    df[text_field] = df[text_field].apply(lambda elem: re.sub(r"(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)|^rt|http.+?", "", elem))
    df[text_field] = df[text_field].apply(tt.tokenize)
    return df
testing_clean = clean_text(test, "tweet")
training_clean = clean_text(train, "tweet")




# Functions for upsampling to equalise the tweets labelled as "0" with the tweets labelled as "1"
train_majority = training_clean[training_clean.label==0]
train_minority = training_clean[training_clean.label==1]

train_minority_upsampled = resample(train_minority,
                                    replace=True,
                                    n_samples=len(train_majority),
                                    random_state=123)
train_upsampled = pd.concat([train_minority_upsampled,
                             train_majority])
train_upsampled['label'].value_counts()

pipeline_sgd=Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('nb', SGDClassifier()),
])
#Splitting data in to training and testing
X_train, X_test, Y_train, Y_test = \
    train_test_split(train_upsampled['tweet'],
    train_upsampled['label'],random_state=0)

#Fits the model to the training data, and calculates F1 score
model = pipeline_sgd.fit(X_train,Y_train)
y_predict = model.predict(X_test)
print(f1_score(Y_test, y_predict))

(я знаю, что некоторые операции импорта в настоящее время не используются, они только что были импортированный, готовый для использования во время работы, также блок кода конвейера с CountVectorizer et c - это то, что я заменю, как только этот токенайзер будет работать)

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

Редактировать *

df[text_field] = df[text_field].apply(tt.tokenize)

это строка, которую я пытался токенизировать с помощью

Большое спасибо!

...