用于分类的文本预处理 - 机器学习



预处理我们的Twitter文本以在二进制类之间进行分类的重要步骤是什么? 我所做的是我删除了主题标签并保留了没有主题标签的标签,我还使用了一些正则表达式来删除特殊字符,这是我使用的两个功能。

def removeusername(tweet):
return " ".join(word.strip() for word in re.split('@|_', tweet))
def removingSpecialchar(text):
return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z t])|(w+://S+)"," ",text).split())

预处理文本数据的其他内容是什么。我还使用 nltk 停用词语料库从标记化词中删除所有停用词。

我在 textblob 中使用 NaiveBayes 分类器来训练数据,我在训练数据上获得了 94% 的准确率,在测试数据上获得了 82% 的准确率。我想知道是否有其他方法可以获得良好的精度。顺便说一下,我是这个机器学习领域的新手,我对所有这些领域的想法都很有限!

那么,你可以从玩你的词汇量开始。您可能会排除数据中过于频繁的某些字词(不被视为停用词(。并且对仅出现在一条推文中的单词(例如拼写错误的单词(也执行相同的操作。Sklearn CountVectorizer允许以简单的方式做到这一点,查看min_dfmax_df参数。

由于您正在使用推文,因此您还可以考虑 URL 字符串。尝试从链接中获取一些有价值的信息,有很多不同的选择,从基于正则表达式的简单内容检索页面域名到更复杂的基于 NLP 的方法来研究链接内容。再一次由你决定!

我也会看看代词(如果您使用的是 sklearn(,因为默认情况下将它们全部替换为关键字 -PRON- 。这是一个经典的解决方案,可以简化事情,但最终可能会导致信息丢失。

要预处理原始数据,您可以尝试:

  • 停用词删除。
  • 干提取或词形还原。
  • 排除太常见或太罕见的术语。

然后可以进行第二步预处理:

  • 构建 TFIDF 矩阵。
  • 构造或加载预训练的单词嵌入(Word2Vec,Fasttext等(。

然后,您可以将第二步的结果加载到模型中。

这些只是最常见的"方法",还有许多其他方法存在。

我会让你自己检查这些方法中的每一个,但这是一个很好的基础。

没有强制性步骤。例如,删除停用词(也称为功能词(是很常见的,例如"是"、"否"、"与"。但是 - 在我的一个管道中,我跳过了这一步,准确性没有改变。NLP是一个 实验领域 ,因此最重要的建议是构建一个尽可能快地运行的管道,定义您的目标,并使用不同的参数进行训练。

在继续之前,您需要确保训练集是正确的。你训练的目的是什么?你的集合是否干净(例如,积极的只有积极的(?您如何定义准确性,为什么?

现在,您描述的情况似乎是过度拟合的情况。为什么?因为你在训练集上获得了 94% 的准确率,但在测试集上只有 82% 的准确率。

当您有很多特征但训练数据集相对较小时,就会发生此问题 - 因此模型最适合特定的训练集,但无法泛化。

现在,您没有指定数据集的大小,所以我猜测在 50 到 500 条推文之间,考虑到大约 200k 个单词或更多的英语词汇量,这太小了。我会尝试以下选项之一: (1(获取更多的训练数据(至少2000( (2(减少特征的数量,例如可以删除不常见的单词,名称 - 任何只出现次数很少的单词 (3(使用更好的分类器(贝叶斯对于NLP来说相当弱(。尝试 SVM 或深度学习。 (4(尝试正则化技术

最新更新