聚类

来源:互联网 发布:win域名是哪个国家的 编辑:程序博客网 时间:2024/06/16 09:40

1爬虫获取数据

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

# 载入 nltk 的英文停用词作为“stopwords”变量stopwords=nltk.corpusstopwords = nltk.corpus.stopwords.words('english')print stopwords[:10]# 载入 nltk 的 SnowballStemmer 作为“stemmer”变量from nltk.stem.snowball import SnowballStemmerstemmer = 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_similaritydist = 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()


原创粉丝点击