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

问题描述 投票:-1回答:3

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

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())

什么是预处理textdata的其他东西。我还使用了nltk stopword语料库从tokenize单词中删除所有停用词。

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

python machine-learning textblock text-classification naivebayes
3个回答
1
投票

那么你可以从你的词汇大小开始。您可以排除数据中过于频繁的一些词(不被视为停用词)。并且也只使用仅出现在一条推文中的单词(例如拼写错误的单词)。 Sklearn CountVectorizer允许以简单的方式执行此操作,看看min_df和max_df参数。

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

我还会看一下代词(如果你使用sklearn),因为默认情况下将所有代词都替换为关键字-PRON-。这是一种经典的解决方案,可以简化操作,但可能会导致信息丢失。


1
投票

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

  • 停止删除单词。
  • 词干化或词形还原。
  • 排除过于常见或过于罕见的条款。

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

  • 构造TFIDF矩阵。
  • 构造或加载预训练的wordEmbedding(Word2Vec,Fasttext,...)。

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

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

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


0
投票

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

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

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

当您拥有大量功能但训练数据集相对较小时会发生此问题 - 因此该模型最适合特定列车集,但无法概括。

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

© www.soinside.com 2019 - 2024. All rights reserved.