利用支持向量机做文本分类

优质
小牛编辑
127浏览
2023-12-01

选取出关键特征

通过tf-idf计算出来的数值是某个特征(词)对于这篇文档的权重,不代表这个特征(词)在文本分类中的权重。这很容易理解,比如某一个特征(词)在多个分类中的tf-idf是不一样的,但是这个特征对于这个分类问题的权重肯定是一个定值。

选取重要的特征的方法可以是:1.)按tf-idf排序从大到小选topN;2)按特征的普遍性选取(在多个类别中出现过);3)按特征在不同文档中tf-idf的差距选择;

我们这次采取结合的形式:在至少2个类别中tf-idf大于0,同时在多个类别中第一名高于第二名10%以上。这么选择的原因是:我的总类别一共5种比较少,所以2个类别以上就说明具有普遍性了,你可以根据你的类别数目调整,第一名高于第二名10%表示这个特征具有一定的区分度。

修改我们的feature_extract.py如下:

def feature_dump():
    cursor = conn.cursor()
    category={}
    category[0] = 'isTec'
    category[1] = 'isSoup'
    category[2] = 'isMR'
    category[3] = 'isMath'
    category[4] = 'isNews'
    corpus=[]
    for index in range(0, 5):
        sql = "select segment from CrawlPage where " + category[index] + "=1"
        print sql
        cursor.execute(sql)
        line = ""
        for result in cursor.fetchall():
            segment = result[0]
            line = line + " " + segment
        corpus.append(line)
    conn.commit()
    conn.close()
    vectorizer=CountVectorizer()
    csr_mat = vectorizer.fit_transform(corpus)
    transformer=TfidfTransformer()
    tfidf=transformer.fit_transform(csr_mat)
    word=vectorizer.get_feature_names()
    print tfidf.toarray()
    for index in range(0, 5):
        f = file("tfidf_%d" % index, "wb")
        for i in np.argsort(-tfidf.toarray()[index]):
            if tfidf.toarray()[index][i] > 0:
                f.write("%f %s\n" % (tfidf.toarray()[index][i], word[i]))
        f.close()
def feature_extraction():
    d = {}
    for index in range(0, 5):
        f = file("tfidf_%d" % index, "r")
        lines = f.readlines()
        for line in lines:
            word = line.split(' ')[1][:-1]
            tfidf = line.split(' ')[0]
            if d.has_key(word):
                d[word] = np.append(d[word], tfidf)
            else:
                d[word] = np.array(tfidf)
        f.close();
    f = file("features.txt", "wb")
    for word in d:
        if d[word].size >= 2:
            index = np.argsort(d[word])
            if float(d[word][index[d[word].size-0-1]]) - float(d[word][index[d[word].size-1-1]]) > 0.01:
                f.write("%s %s\n" % (word, d[word]))
    f.close()
if __name__ == '__main__':
    #get_segment();
    feature_dump();
    feature_extraction();

最终输出的features.txt中有809个特征供我们使用,如下:

集群 ['0.027741' '0.014016' '0.010606']
分类器 ['0.002870' '0.045052' '0.000943']
中心 ['0.008167' '0.001647' '0.004274' '0.006954' '0.031360']
首席 ['0.003015' '0.017036']
fit ['0.016885' '0.000284']
懂得 ['0.035888' '0.001629' '0.003064']
密度 ['0.002414' '0.002106' '0.015073' '0.001586']
master ['0.021045' '0.002002' '0.000471']
对方 ['0.002414' '0.020451' '0.001684' '0.003569']
物品 ['0.020088' '0.001158' '0.001414']
……

研究scikit-learn SVM的使用

利用支持向量机模型可以直接使用scikit-learn,下一节我们再来研究一下scikit-learn的支持向量机怎么用