НЛП - Как добавить больше возможностей? - PullRequest
2 голосов
/ 31 мая 2019

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

enter image description here

Модель ниже использует только текстовые данные для классификации каждой записи.Текст преобразуется с помощью TF-IDF в разреженную матрицу перед импортом в классификатор.

Есть ли способ добавить / использовать и другие функции?Эти функции не в формате разреженной матрицы, поэтому не знаете, как их объединить с текстовой разреженной матрицей.


    #import libraries
    import string, re, nltk
    import pandas as pd
    from pandas import Series, DataFrame
    from nltk.corpus import stopwords
    from nltk.stem.porter import PorterStemmer
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report
    from sklearn.pipeline import Pipeline

    # read data and remove empty lines
    dataset = pd.read_csv('sample_data.txt',
                           sep='\t',
                           names=['content','location','population','target'])
                           .dropna(how='all')
                           .dropna(subset=['target'])

    df = dataset[1:]

    #reset dataframe index
    df.reset_index(inplace = True)

    #add an extra column which is the length of text
    df['length'] = df['content'].apply(len)

    #create a dataframe that contains only two columns the text and the target class
    df_cont = df.copy()
    df_cont = df_cont.drop(
        ['location','population','length'],axis = 1)

    # function that takes in a string of text, removes all punctuation, stopwords and returns a list of cleaned text

    def text_process(mess):
        # lower case for string
        mess = mess.lower()

        # check characters and removes URLs
       nourl = re.sub(r'http\S+', ' ', mess)

        # check characters and removes punctuation
        nopunc = [char for char in nourl if char not in string.punctuation]

        # join the characters again to form the string and removes numbers
        nopunc = ''.join([i for i in nopunc if not i.isdigit()])

        # remove stopwords
        return [ps.stem(word) for word in nopunc.split() if word not in set(stopwords.words('english'))]

    #split the data in train and test set and train/test the model

    cont_train, cont_test, target_train, target_test = train_test_split(df_cont['content'],df_cont['target'],test_size = 0.2,shuffle = True, random_state = 1)


    pipeline = Pipeline([('bag_of_words',CountVectorizer(analyzer=text_process)),
                         ('tfidf',TfidfTransformer()),
                         ('classifier',MultinomialNB())])

    pipeline.fit(cont_train,target_train)
    predictions = pipeline.predict(cont_test)

    print(classification_report(predictions,target_test))

Ожидается, что модель выдаст следующее: точность, точность, отзыв, f1-оценка

Ответы [ 3 ]

1 голос
/ 31 мая 2019

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

Лондон - 100

Манчестер - 010

Эдинбург - 001

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

Как только это будет сделано, вы можете объединить всю строку в одномерный массив и затем передать его в классификатор.

0 голосов
/ 31 мая 2019

Вы можете преобразовать свою разреженную матрицу в numpy array, используя метод toarray.

Вы получите вектор для каждой текстовой записи, который вы можете сопоставить с другими функциями.

0 голосов
/ 31 мая 2019

Не похоже, что мы можем напрямую кодировать текст как функцию.Так что вам, вероятно, нужно нормализовать это.Вы можете выбрать одну из строк текста и установить ее в качестве стандарта.Используйте TFIDF, чтобы вычислить оценку соответствия между вашим стандартным текстом и текстом для каждой строки.Затем вы можете закодировать этот процент как функцию.Я понимаю, что это очень окольный способ кодирования, но в зависимости от текста, который вы выбираете в качестве стандарта, он может работать.

...