我是靠谱客的博主 闪闪星星,最近开发中收集的这篇文章主要介绍数据科学【九】:SVD(二)数据科学【九】:SVD(二),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

数据科学【九】:SVD(二)

数据准备

我们这次研究文本数据。我们可以从sklearn.datasets获得fetch_20newsgroups,即20个不同范畴的新闻文本集;这里我们选取四个范畴。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.stem.snowball import SnowballStemmer

categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
news_data = fetch_20newsgroups(subset='train', categories=categories)

分词

每一篇文章可视为一个字符串。这个字符串由空格、换行符以及词组成。需要注意的是,同一个词可能有多种变形,比如时态、复数、变格等等,视语言而定。从诸多变形中“提取”词语,即为分词。我们可以调用SnowballStemmer()实现:

stemmer = SnowballStemmer('english')
stemmed_articles = []
for article in news_data.data:
    stemmed_words = []
    for word in article.split():
        stemmed_words.append(stemmer.stem(word))

    stemmed_articles.append(" ".join(stemmed_words))

词的重要性

给定一个词和一个文本集,如何量化这个词的重要性?一个指标是tf-idf特征。tf-idf特征有两部分构成,分别为:

  • TF(t, a):词语t在文章a中出现的比率,即t出现的次数/文章总词数。
  • IDF(t, s):文章集合的文章数比出现词语t的文章数的对数,即log10(文章总数/出现该词的文章数)
  • tf-idf: TF 与IDF的乘积。

通过以上定义,我们知道在一个文本集中,对每一篇文本都有一个特征向量。
我们可以使用from sklearn.feature_extraction.text import TfidfVectorizer来获得tf-idf特征向量。

import pandas as pd

tfidfvctr = TfidfVectorizer(max_df = 0.25, min_df = 0.05)
tfidf_mat = tfidfvctr.fit_transform(stemmed_articles)
tfidf_df = pd.DataFrame(tfidf_mat.toarray())
tfidf_df.to_csv("tfidf.csv", index=False)

对tf-idf使用SVD降维

我们对上文得到的SVD矩阵降维,保留不同秩的特征值,并通过disagreemet distance评价聚类效果。

disagreement_distance = []
original_dataset = pd.read_csv("tfidf.csv", low_memory=False).values
for k in range(1,25):
    
    dim_reduced_dataset = PCA(k).fit_transform(original_dataset)
    
    kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=100, n_init=10, random_state=0)
    kmeans.fit_predict(dim_reduced_dataset)
    labelsk = kmeans.labels_
    disagreement_distance.append(disagreement_dist(labelsk, news_data.target))

plt.plot(range(1,25), disagreement_distance)
plt.ylabel('Disagreement')
plt.xlabel('Dimension')
plt.show()

在这里插入图片描述

最后

以上就是闪闪星星为你收集整理的数据科学【九】:SVD(二)数据科学【九】:SVD(二)的全部内容,希望文章能够帮你解决数据科学【九】:SVD(二)数据科学【九】:SVD(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部