我正在学习一个关于用Python构建机器学习系统的教程,我正在对它进行修改,并试图将一篇新文章归类为7个不同类别中的一个。
english_stemmer = nltk.stem.SnowballStemmer('english')
class StemmedTfidfVectorizer(TfidfVectorizer):
def build_analyzer(self):
analyzer = super(TfidfVectorizer, self).build_analyzer()
return lambda doc: (english_stemmer.stem(w) for w in analyzer(doc))
我的矢量器看起来像下面的那个。除其他外,我正在尝试测试对4号n_grams的敏感性;但我不确定这是否是一个最佳参数。
vectorizer = StemmedTfidfVectorizer(min_df = 1, stop_words = 'english', decode_error ='ignore', ngram_range=(1, 4))
我要分类的"新帖子"被转换为一个向量,然后将其与其他向量进行比较,这些向量表示我要比较我的"新文章"向量的类别。尽管分类器对一些标签做得很好,但对其他一些标签来说,描述帖子的最佳类别是第二高分,而不是第一高分。
我怀疑我的问题是我用来比较向量的距离度量,这是一个简单的欧几里得距离。
def dist_norm(v1, v2):
v1_normalized = v1/sp.linalg.norm(v1.toarray())
v2_normalized = v2/sp.linalg.norm(v2.toarray())
delta = v1_normalized - v2_normalized
return sp.linalg.norm(delta.toarray())
我的问题是:1) 是否可以使用其他距离度量?2) 如何修改dist_norm以适应其他距离度量?3) 对于ML专家来说,我的问题是特征工程问题还是距离度量问题?我目前有7个大样本,具有超过1MM的功能(使用ngram大小4可能有些过头了)4) 有没有ipython笔记本或经典教程可以将文本分类为几个类别?(例如,一个既可以被归类为"政治"又可以被归类于"人民"的主题,或者选择2个标签而不是一个标签的"模糊度量"。
感谢
余弦相似性是一个非常常见且有效的度量,可以用来代替欧几里得距离(http://en.wikipedia.org/wiki/Cosine_similarity)。
您可以在这里阅读关于python中余弦相似性的实现(以替换def-dist_norm(v1,v2)):两个数字列表之间的余弦相似性
据我所知,在处理分类任务时,我们通常不会遇到距离度量这样的问题。正如您所知,有几种常用的标准度量标准。有时人们会使用多个指标,或者只使用一个具有不同参数的指标来比较结果,但在经验分类任务中,我们很少修改这些指标,除非你真的想对指标进行理论研究。我认为你应该把你的问题看作一个功能工程任务。
对于许多IR/NLP任务,通常建议选择大小为3的n-gram,因为它足够大,可以捕获一些语法依赖关系,但也不太大,可以引入太多不相关的信息。
文档/文本分类是一个庞大的主题。如果你想知道如何对文档集合进行分类,你应该了解:1。文本预处理2。(文本)特征提取2。相似性度量3。机器学习模型4。ML模型评估和可视化(可选)
您可能已经知道这一点,但当您处理文本时,学习正则表达式也非常有用。