2

我正在使用 scikit-learn 构建一个分类器来预测两个句子是否是释义(例如释义:爱因斯坦有多高与阿尔伯特爱因斯坦的长度是多少)。

我的数据由 2 个带有字符串(短语对)的列和 1 个带有 0 和 1 的目标列组成(= 没有释义,释义)。我想尝试不同的算法。

我希望下面的最后一行代码适合模型。相反,预处理管道不断产生我无法解决的错误:“AttributeError:'numpy.ndarray'对象没有属性'lower'。”

代码如下,我已经隔离了显示的最后一行中发生的错误(为简洁起见,我排除了其余部分)。我怀疑这是因为目标列包含 0 和 1,不能转为小写。

我已经在stackoverflow上尝试过类似问题的答案,但到目前为止还没有运气。

你怎么能解决这个问题?

question1               question2                        is_paraphrase
How long was Einstein?  How tall was Albert Einstein?    1
Does society place too  How do sports contribute to the  0
much importance on      society?
sports?                 
What is a narcissistic  What is narcissistic personality 1  
personality disorder?   disorder?

======

from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np

para = "paraphrases.tsv"

df = pd.read_csv(para, usecols = [3, 5], nrows = 100, header=0, sep="\t")

y = df["is_paraphrase"].values
X = df.drop("is_paraphrase", axis=1).values
X = X.astype(str) # I have tried this
X = np.char.lower(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, 
random_state = 21, stratify = y)

text_clf = Pipeline([('vect', CountVectorizer()),('tfidf', TfidfTransformer()), 
('clf', MultinomialNB())])

text_clf.fit(X_train, y_train)
4

1 回答 1

0

错误不是因为最后一列,而是因为您的 Train xdataset 将包含两列question1question2. 现在这将导致您X_train将每一行作为值列表。因此,当CountVectorizer尝试将其转换为小写时,它会返回错误,因为 numpy.ndarray 不包含 lower 函数。

为了克服这个问题,您需要将数据集X_train分成两部分,比如X_train_pt1X_train_pt2。然后对这些单独执行 CountVectorizer,然后对每个单独的结果执行 tfidfTransformer。还要确保您在这些数据集上使用相同的对象进行转换。

最后,将这两个数组堆叠在一起,并将其作为分类器的输入。您可以在此处找到类似的实现

更新:
我认为以下内容应该会有所帮助(我承认可以进一步改进此代码以提高效率):

def flat_list(my_list):
    return [str(item) for sublist in my_list for item in sublist]


def transform_data(trans_obj_list,dataset_splits):
    X_train = dataset_splits[0].astype(str)
    X_train = flat_list(X_train)

    for trfs in trans_obj_list:
        transformed_vector = trfs().fit(X_train)
        for x in xrange(0,len(dataset_splits)):
            dataset_splits[x] =flat_list(dataset_splits[x].astype(str))
            dataset_splits[x]=transformed_vector.transform(dataset_splits[x])

    return dataset_splits

new_X_train,new_X_test = transform_data([CountVectorizer,TfidfTransformer],[X_train,X_test])
于 2017-09-17T15:02:27.417 回答