欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

聚类

程序员文章站 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()