繁体   English   中英

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

[英]Text Preprocessing for classification - Machine Learning

预处理我们的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 classifer来训练数据,我在训练数据上的准确性达到94%,在测试数据上达到82%。 我想知道是否还有其他方法可以取得良好的准确性。 顺便说一下,我是这个机器学习领域的新手,我对这一切都只有有限的想法!

好了,您可以从词汇量的大小入手。 您可能会排除一些数据中过于频繁的词(不被视为停用词)。 对于仅出现在一条推文中的字词(例如,拼写错误的字词),也是如此。 Sklearn CountVectorizer允许以简单的方式查看min_dfmax_df参数。

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

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

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

  • 停止单词删除。
  • 摘除或拔除。
  • 排除太常见或太少的术语。

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM