python - 使用 tfidvectoriser 时出现奇怪的线条,可能是用 ' ' 替换引起的?
问题描述
我昨天在这里发布了关于制作用于预测情绪的文本线性回归模型,我想知道的是在将文本小写,删除任何停用词/标点符号和数字之后,我的一些文本特征上留下了奇怪的线条。
['_______',
'__________',
'__________ pros',
'____________',
'____________ pros',
'_____________',
'_____________ pros',
'aa',
'aa waist',
'ab',
'abdomen',
'ability',
'able',
'able button',
'able buy',
我在想可能是因为对于标点符号和数字,我用空格代替了它们?我仍然不确定。
另一个问题是我如何为线性回归正确构建它?我应该用一列特征表示每个句子并将其输入网络吗?但是如果矩阵稀疏,我将如何处理?
抱歉刚刚了解了有关文本预处理的更多信息
以下是我的清洁步骤:假设一句话是这样的:“这件可爱的铂金连衣裙非常女性化,非常合身,穿起来也很舒服!强烈推荐!'
小写
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))
测试/训练拆分,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)
这给了我上面的特征名称输出?
解决方案
我认为使用TfidfVectorizer
是开始进行情绪分析的初步尝试的好地方。为了避免特征向量的稀疏性,您可能希望从较少的特征开始,然后根据模型的执行情况逐步增加。您可以在训练和使用时将其设为超参数,并GridSearch
为Pipeline
它找到最佳价值。请参阅此处的示例。根据具体情况,更健壮的实现可能会使用词嵌入。但是,这很可能会给您的模型带来更多复杂性。
字符串中奇怪的行是源文本中必须存在的下划线字符。它们在您的清理过程中没有被清理,因为您使用了re.sub(r'[^\w\s]', '',x)
从字符串中删除非单词字符和非空格。下划线是单词字符集 ( '\w'
) 的一部分,因此它们没有被清除。
我还应该指出,您的大部分自定义清洁都不是必需的,因为TfidfVectorizer
应该能够为您处理这个问题。例如,您删除停用词,然后TfidfVectorizer
尝试删除它们。从字符串中删除标点符号和数字也是如此。TfidfVectorizer
接受一个token
参数,您可以将正则表达式传递给它以选择要保留在令牌中的字符。如果您只想要字符串中的字母字符,则令牌参数的这个正则表达式应该足以为您处理清理:'[a-zA-Z]'
. 同样,我在这里不使用'\w'
字符集,因为它包含下划线(和数字)。
由于您已经在训练集和测试集上运行了fit_transform
方法,因此这些集中的样本应该准备好进行训练/测试。它们不需要进一步处理。TfidfVectorizer
transform
推荐阅读
- flutter - 如何在卡片上堆叠和对齐标签
- ios - 检测和处理 WKWebView (iOS-Swift) 中的操作
- python - 如何让玩家移动一次,然后在到达“瓷砖”时停下来
- assembly - 在汇编 x86 实模式下寻址如何工作?为什么标签返回不同的值?
- azure - Azure 事件中心 - 别名与区域终结点?
- azure - 创建包含按租户/目录分组的订阅列表的参数 - Azure 资源图
- sitecore - 如何在 C# Sitecore 中以编程方式添加插入选项
- java - 无法解析方法 'putExtra(java.lang.String, java.util.List
) - css - 删除表格中的填充
- r - R data.table:按(不同)组优化行操作的速度