文本预处理以进行分类-机器学习

时间:2018-06-22 11:27:54

标签: python machine-learning textblock text-classification naivebayes

什么是对我们的 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%。我想知道是否还有其他方法可以取得良好的准确性。顺便说一下,我是这个机器学习领域的新手,我对这一切都只有有限的想法!

3 个答案:

答案 0 :(得分:1)

那么您就可以从词汇量的大小开始。您可能会排除一些数据中过于频繁的词(不被视为停用词)。对于仅出现在一条推文中的字词(例如,拼写错误的字词),也是如此。 Sklearn CountVectorizer允许轻松查看 min_df max_df 参数。

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

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

答案 1 :(得分:1)

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

  • 停止单词删除。
  • 词干或词法化
  • 排除太常见或太少的术语。

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

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

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

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

我将让您自己检查每种方法,但这是一个很好的基础。

答案 2 :(得分:0)

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

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

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

当您具有很多功能但训练数据集相对较小时,就会发生此问题-因此该模型最适合特定的训练集,但无法一概而论。

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