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

Python sklearn.feature_extraction.text-特征工程中距离度量的选择,python,machine-learning,nlp,scikit-learn,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_analyz

我正在学习一个关于用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号纽克的敏感性;但我不确定这是否是一个最佳参数

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笔记本或经典教程可用于将文本分类为多个类别?(例如,一个主题既可以分为“政治”也可以分为“人”,或者一些“模糊指标”来选择两个标记而不是一个


多亏了

余弦相似度()是一个非常常用且有效的度量,可以用来代替欧几里德距离

您可以在这里阅读关于python中余弦相似性的实现(以替换def dist_norm(v1,v2)):

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

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

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


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

scipy.spatial.distance.pdist是距离度量的优秀来源。我猜Pearson(相关性)度量可能比欧几里德方法给出更好的结果;但您的模型可能没有合适的特性。