聚类

1爬虫获取数据

2选择停用词,词根,构造分词器

# 载入 nltk 的英文停用词作为“stopwords”变量
stopwords=nltk.corpus
stopwords = nltk.corpus.stopwords.words('english')
print stopwords[:10]


# 载入 nltk 的 SnowballStemmer 作为“stemmer”变量
from nltk.stem.snowball import SnowballStemmer
stemmer = SnowballStemmer("english")


def tokenize_and_stem(text):
    # 首先分句,接着分词,而标点也会作为词例存在
    tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)]
    filtered_tokens = []
    # 过滤所有不含字母的词例(例如:数字、纯标点)
    for token in tokens:
        if re.search('[a-zA-Z]', token):
            filtered_tokens.append(token)
    stems = [stemmer.stem(t) for t in filtered_tokens]
    return stems
3TFIDF向量化文本,计算余弦相似度

在数学中余弦相似度的公式:cos(a,b)=a*b/(|a|+|b|),而在文本上,我们的余弦相似度通常是这样计算而成:

(文本a,b共同出现的词条数目)/(文本a出现的词条数目+文本b出现的词条数目)

from sklearn.feature_extraction.text import TfidfVectorizer
#在80%文档出现过max_df最高频率,的出现太多没用
#max_df最小,太小没用,在n个以上文档中出现
## ngram_range=(1,3),观察一元-三元模型的关系
tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
                                 min_df=0.2, stop_words='english',
                                 use_idf=True, tokenizer=tokenize_and_stem, ngram_range=(1,3))

#词汇表
terms = tfidf_vectorizer.get_feature_names()
#计算余弦相似度,不同文档之间的距离,相似性越大距离越小
from sklearn.metrics.pairwise import cosine_similarity
dist = 1 - cosine_similarity(tfidf_matrix)

4模型暂时保存

joblib.dump(km,  'doc_cluster.pkl')

km = joblib.load('doc_cluster.pkl')

5模型结果

clusters = km.labels_.tolist()
#分类结果
films = { 'title': titles, 'rank': ranks, 'synopsis': synopses, 'cluster': clusters, 'genre': genres }
frame = pd.DataFrame(films, index = [clusters] , columns = ['rank', 'title', 'cluster', 'genre'])
frame['cluster'].value_counts()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值