NLP-如何添加更多功能?

时间:2019-05-31 09:59:24

标签: python machine-learning scikit-learn nlp tf-idf

我想使用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-分数

4 个答案:

答案 0 :(得分:0)

我们似乎无法直接将文本编码为功能。因此,您可能需要对其进行标准化。您可以选择文本行之一并将其设置为标准行。使用TFIDF计算标准文本与每一行文本之间的匹配分数。然后,您可以将该百分比编码为特征。我意识到这是一种非常round回的编码方式,但是根据您选择的标准文本,它可能会起作用。

答案 1 :(得分:0)

您可以使用numpy array方法将稀疏矩阵转换为toarray

您将为每个文本条目获得一个向量,您可以将其与其他功能结合使用。

答案 2 :(得分:0)

我认为您需要对“位置”功能使用一次性热引导。 给定数据的一元矢量将是

伦敦-100

曼彻斯特-010

爱丁堡-001

向量长度是您在其中拥有的城市数。请注意,这里的每一位都是一个功能。 在将分类数据馈入机器学习算法之前,通常会将其转换为一热向量。

完成此操作后,您可以将整行合并为一维数组,然后将其馈送到分类器。

答案 3 :(得分:0)

x_tfidf = hstack((x_tfidf , np.array(df['additonal_feature'])[:,None]))  
x_tfidf = x_tfidf.tocsr()