聚类
来源:互联网 发布: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 stems3TFIDF向量化文本,计算余弦相似度
在数学中余弦相似度的公式: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()