首页 > 解决方案 > 使用 tfidvectoriser 时出现奇怪的线条,可能是用 ' ' 替换引起的?

问题描述

我昨天在这里发布了关于制作用于预测情绪的文本线性回归模型,我想知道的是在将文本小写,删除任何停用词/标点符号和数字之后,我的一些文本特征上留下了奇怪的线条。

     ['_______',


'__________',
 '__________ pros',
 '____________',
 '____________ pros',
 '_____________',
 '_____________ pros',
 'aa',
 'aa waist',
 'ab',
 'abdomen',
 'ability',
 'able',
 'able button',
 'able buy',

我在想可能是因为对于标点符号和数字,我用空格代替了它们?我仍然不确定。

另一个问题是我如何为线性回归正确构建它?我应该用一列特征表示每个句子并将其输入网络吗?但是如果矩阵稀疏,我将如何处理?

抱歉刚刚了解了有关文本预处理的更多信息

以下是我的清洁步骤:假设一句话是这样的:“这件可爱的铂金连衣裙非常女性化,非常合身,穿起来也很舒服!强烈推荐!'

  1. 小写

    AllSentences['Sentence'] = AllSentences['Sentence'].map(lambda x: x.lower())

2.删除停用词

  stop = stopwords.words('english')
    AllSentences['Sentences_without_stopwords'] = AllSentences['Sentence'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))

3.删除号码

AllSentences['Sentences_without_stopwords_punc'] = AllSentences['Sentences_without_stopwords'].apply(lambda x: re.sub(r'[^\w\s]', '',x))
AllSentences['Sentences_without_stopwords_punc'] = AllSentences['Sentences_without_stopwords_punc'].apply(lambda x: re.sub(r'\d+', '',x))
  1. 测试/训练拆分,tfidvectorise

    X_train, X_test, y_train, y_test = train_test_split(X, Y, 
     test_size=0.30, random_state=42)
    
       vect_word = TfidfVectorizer(max_features=20000, lowercase=True, 
       analyzer='word',stop_words= 'english',ngram_range=(1,3),dtype=np.float32)
    
    tr_vect = vect_word.fit_transform(X_train)
    ts_vect = vect_word.transform(X_test)
    

这给了我上面的特征名称输出?

标签: pythonscikit-learnlinear-regressiondata-science

解决方案


我认为使用TfidfVectorizer是开始进行情绪分析的初步尝试的好地方。为了避免特征向量的稀疏性,您可能希望从较少的特征开始,然后根据模型的执行情况逐步增加。您可以在训练和使用时将其设为超参数,并GridSearchPipeline它找到最佳价值。请参阅此处的示例。根据具体情况,更健壮的实现可能会使用词嵌入。但是,这很可能会给您的模型带来更多复杂性。

字符串中奇怪的行是源文本中必须存在的下划线字符。它们在您的清理过程中没有被清理,因为您使用了re.sub(r'[^\w\s]', '',x)从字符串中删除非单词字符和非空格。下划线是单词字符集 ( '\w') 的一部分,因此它们没有被清除。

我还应该指出,您的大部分自定义清洁都不是必需的,因为TfidfVectorizer应该能够为您处理这个问题。例如,您删除停用词,然后TfidfVectorizer尝试删除它们。从字符串中删除标点符号和数字也是如此。TfidfVectorizer接受一个token参数,您可以将正则表达式传递给它以选择要保留在令牌中的字符。如果您只想要字符串中的字母字符,则令牌参数的这个正则表达式应该足以为您处理清理:'[a-zA-Z]'. 同样,我在这里不使用'\w'字符集,因为它包含下划线(和数字)。

由于您已经在训练集和测试集上运行了fit_transform方法,因此这些集中的样本应该准备好进行训练/测试。它们不需要进一步处理。TfidfVectorizertransform


推荐阅读