聚类
程序员文章站
2022-05-26 21:16:39
...
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()