【问题标题】:Python NLTK code snippet to train a classifier (naive bayes) using feature frequency使用特征频率训练分类器(朴素贝叶斯)的 Python NLTK 代码片段
【发布时间】:2011-01-10 21:17:50
【问题描述】:

我想知道是否有人可以通过代码 sn-p 帮助我,该代码演示了如何使用特征频率方法而不是特征存在来训练朴素贝叶斯分类器。

我认为下面第 6 章中所示的 link text 是指使用 Feature Presence (FP) 创建功能集 -

def document_features(document): 
    document_words = set(document) 

    features = {}
    for word in word_features:
        features['contains(%s)' % word] = (word in document_words)

    return features

请指教

【问题讨论】:

    标签: python nlp nltk stanford-nlp


    【解决方案1】:

    在您发送的链接中,它说此功能是特征提取器,它仅检查每个单词是否存在于给定文档中。

    下面是整个代码,每行都有数字:

    1     all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
    2     word_features = all_words.keys()[:2000] 
    
    3     def document_features(document): 
    4          document_words = set(document) 
    5          features = {}
    6          for word in word_features:
    7               features['contains(%s)' % word] = (word in document_words)
    8          return features
    

    在第 1 行,它创建了一个所有单词的列表。

    在第 2 行中,它使用最频繁的 2000 个单词。

    3函数的定义

    4 转换文档列表(我认为它必须是列表)并将列表转换为集合。

    5 声明一个字典

    6 次迭代所有最常见的 2000 个单词

    7 创建一个字典,其中键是'contains(theword)',值是真或假。如果该单词存在于文档中则为真,否则为假

    8 返回字典,显示文档是否包含最频繁的 2000 个单词。

    这能回答你的问题吗?

    【讨论】:

    • 不幸的是不是——尽管我理解它在做什么——我不确定当人们说他们使用频率存在来训练分类器时——这就是他们的意思。如果我要使用“频率特征”方法进行训练,我还需要进行哪些更改。
    • 对我来说,将其称为频率/存在听起来似乎是合理的。因为你找出语料库中最常用的词,然后检查它是否存在于文档中。您能否提供提到它作为“频率存在”的参考资料。您发送的页面中没有使用它。
    • 实际上在您发送的页面中,实际训练发生在此代码中“featuresets = [(document_features(d), c) for (d,c) in documents] train_set, test_set = featuresets[100 :],特征集[:100] 分类器 = nltk.NaiveBayesClassifier.train(train_set)"。 document_feature 功能是对数据进行预处理,以选择特征来训练您的分类器(NaiveBayesClassifier)。 en.wikipedia.org/wiki/Data_mining#Pre-processing 。当他们说他们使用频率存在来训练分类器时,他们一定是在说他们使用频率特征选择来预处理数据。
    • “频率特征”方法是什么意思?你的意思是“词频”吗?你想用词频作为特征来训练分类器吗?
    【解决方案2】:

    对于训练,创建可用于创建 ProbDists 的适当 FreqDists,然后可以将其传递给 NaiveBayesClassifier。但分类实际上适用于使用布尔值而不是频率的特征集。因此,如果您想基于 FreqDist 进行分类,则必须实现自己的分类器,该分类器不使用 NLTK 功能集。

    【讨论】:

      【解决方案3】:

      这里有一个方法可以帮助你:

      ''' Returns the frequency of letters '''
      def get_freq_letters(words):
          fdist = nltk.FreqDist([char.lower() for word in words for char in word if char.isalpha()])
          freq_letters = {}
          for key,value in fdist.iteritems():
              freq_letters[key] = value
          return freq_letters
      

      【讨论】:

        猜你喜欢
        • 2017-08-30
        • 2015-06-25
        • 2012-04-18
        • 2016-09-28
        • 2013-04-11
        • 2014-01-13
        • 2020-09-13
        • 2017-04-19
        相关资源
        最近更新 更多