sklearn.feature_extraction.text中的距离度量选择 - 特征工程

时间:2014-10-13 16:30:23

标签: python machine-learning nlp scikit-learn

我正在关注用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个标签而不是一个的“模糊度量”。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用的非常常见且有效的指标代替欧几里德距离是余弦相似度(http://en.wikipedia.org/wiki/Cosine_similarity)。

你可以在这里阅读python中的余弦相似性的实现(以替换def dist_norm(v1,v2)): Cosine Similarity between 2 Number Lists

据我所知,在处理分类任务时,我们通常没有距离度量问题。如您所知,有几种常用的标准指标。有时人们使用不止一个,或者只使用一个具有不同参数的人并比较结果,但在经验分类任务中,我们很少修改这些指标,除非你真的想对指标进行理论研究。我认为你应该把你的问题看作一个特色工程任务。

对于许多IR / NLP任务,通常建议选择大小为3的n-gram,因为它足以捕获一些语法依赖性,但是引入太多不相关的信息并不算太大。

文档/文本分类是一个很大的主题。如果您想了解如何对文档集进行分类,您应该了解:1。文本预处理2.(文本)特征提取2.相似度量3.机器学习模型4. ML模型的评估和可视化(可选)

您可能已经知道这一点,但在处理文本时,了解正则表达式也非常有用。