精华内容
下载资源
问答
  • 使用scikit-learn进行KMeans文本聚类
    千次阅读
    2018-07-25 10:48:41

    使用scikit-learn进行KMeans文本聚类

    K-Means算法:中文名字叫做K-均值算法,算法的目的是将n个向量分别归属到K个中心点里面去。算法首先会随机选择K个中心向量,然后通过迭代计算以及重新选择K个中心向量,使得n个向量各自被分配到距离最近的K中心点,并且所有向量距离各自中心点的和最小。

    步骤一:在输入数据集里面随机选择k个向量作为初始中心点。
    步骤二:将每个向量分配到离各自最近的中心点,从而将数据集分成了K个类。
    步骤三:计算得到上步得到聚类中每一聚类观测值的中心,作为新的均值点。
    步骤四:重复步骤三,直至结果收敛,这里的收敛是指所有点到各自中心点的距离的和收敛。

    K-Means算法的原理比较简单,但是值得注意的是,有两个地方是需要算法使用者去自己选择的:第一个就是K的值,简而言之就是数据集应该被分成多少个类,在K-Means算法里面是要求先给出K值的; 第二个就是距离函数,即如何计算向量和向量或者向量和中心点之间的距离,这里也有很多选择,最常见的自然是欧式距离,也可以用余弦相似度来作为距离函数,还有其他的一些方法等等。以上两个需要注意的选择必然会对聚类结果产生影响,尤其是K值的选择,这里就需要算法使用者根据自身需要来做出仔细衡量。

    scikit-learn

    scikit-learn 是一个基于Python的Machine Learning模块,里面给出了很多Machine Learning相关的算法实现,其中就包括K-Means算法。

    在做K-Means聚类之前,我们首先需要对将文本转化成向量的形式,转换文本的第一步,自然是分词,这里可以直接使用jieba分词,分完词过后再将词转换成向量,或者说转换成Bag-of-words模型,这里可以采用TF-IDF算法,TF-IDF就是从两个方面对文本中的词进行加权:

    1. 词在当前文本中出现的次数。
    2. 总文本数包含词的数目。

    前者越高越好,后者越低越好,比如说「你」,「我」这些词,在一个文本中出现的次数很多,总文本包含这些词的数目也会很多,那么这些词自然无法作为当前文本的代表性内容,如果一个文本中某个词大量出现,但是在总文本中出现的次数又不多,那么这个词对于文本来说很有可能是很重要的。

    在scikit-learn里面,同样也实现了TF-IDF算法,我们可以直接调用。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import jieba 
    from sklearn.feature_extraction.text import  TfidfVectorizer
    from sklearn.cluster import KMeans
    from sklearn.externals import joblib
    
    def jieba_tokenize(text):
        return jieba.lcut(text) 
    
    
    tfidf_vectorizer = 
    
         TfidfVectorizer(tokenizer=jieba_tokenize,lowercase=False)
    
    '''
    tokenizer: 指定分词函数
    lowercase: 在分词之前将所有的文本转换成小写,因为涉及到中文文本处理,
    所以最好是False
    '''
    
    text_list = 
    ["今天天气真好啊啊啊啊", 
    "小明上了清华大学", 
    "我今天拿到了Google的Offer", 
    "清华大学在自然语言处理方面真厉害"]
    
    #需要进行聚类的文本集
    
    tfidf_matrix = tfidf_vectorizer.fit_transform(text_list)
    
    num_clusters = 3
    km_cluster = KMeans(n_clusters=num_clusters, max_iter=300, n_init=40, 
                        init='k-means++',n_jobs=-1)
    
    '''
    n_clusters: 指定K的值
    max_iter: 对于单次初始值计算的最大迭代次数
    n_init: 重新选择初始值的次数
    init: 制定初始值选择的算法
    n_jobs: 进程个数,为-1的时候是指默认跑满CPU
    注意,这个对于单个初始值的计算始终只会使用单进程计算,
    并行计算只是针对与不同初始值的计算。比如n_init=10,n_jobs=40, 
    服务器上面有20个CPU可以开40个进程,最终只会开10个进程
    '''
    
    #返回各自文本的所被分配到的类索引
    result = km_cluster.fit_predict(tfidf_matrix)
    
    print"Predicting result: ", result)
    
    '''
    每一次fit都是对数据进行拟合操作,
    所以我们可以直接选择将拟合结果持久化,
    然后预测的时候直接加载,进而节省时间。
    '''
    
    joblib.dump(tfidf_vectorizer, 'tfidf_fit_result.pkl')
    joblib.dump(km_cluster, 'km_cluster_fit_result.pkl')
    
    #程序下一次则可以直接load
    tfidf_vectorizer = joblib.load('tfidf_fit_result.pkl')
    km_cluster = joblib.load('km_cluster_fit_result.pkl')
    更多相关内容
  • [python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像 http://blog.csdn.net/eastmount/article/details/50545937 包括输入文档txt,共1000行数据,每行都是分词完的文本。 本文主要讲述以下几点: 1.通过...
  • Kmeans文本聚类java实现

    热门讨论 2015-02-17 10:20:03
    java实现的文本聚类使用了kmeans算法
  • [python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像 http://blog.csdn.net/eastmount/article/details/50545937 包括输入文档txt,共1000行数据,每行都是分词完的文本。 本文主要讲述以下几点: 1.通过...
  • 资料说明:包括数据+代码+文档+代码讲解。 1.项目背景 2.数据获取 3.数据预处理 4.探索性数据分析 5.特征工程 6.构建聚类模型 7.结论与展望
  • tf-idf kmeans文本聚类

    千次阅读 2021-11-09 19:23:44
    文本聚类 数据集 THUnews中文新闻文本分类 方法 jieba分词后,使用tf-idf提取特征,提取时使用停用词表删除停用词,最后使用kmeans进行聚类。 优化 优化停用词表,增加max_feature特征,使用minibatchkmeans增加聚类...

    文本聚类

    数据集 THUnews中文新闻文本分类

    方法 jieba分词后,使用tf-idf提取特征,提取时使用停用词表删除停用词,最后使用kmeans进行聚类。

    优化 优化停用词表,增加max_feature特征,使用minibatchkmeans增加聚类速度

    评价标准 外在(已知标签) 兰德基数RI ,调整兰德基数 ARI
    内在 轮廓系数

    from sklearn.feature_extraction.text import TfidfVectorizer
    import paddlenlp
    from sklearn.cluster import KMeans
    import jieba
    

    读取数据,数据集为THUnews新闻文本分类数据,使用jieba分词

    with open('data/data12701/Train.txt','r',encoding='utf-8') as f:
        content=f.readlines()
    data=[]
    label=[]
    for i in content:
        t=i.split('\t')
        t[2]=(" ").join( [w for w in jieba.cut(t[2])] )
        data.append(t[2])
        label.append(t[1])
    
    print(label[:5])
    print(len(label))
    
    
    Building prefix dict from the default dictionary ...
    Dumping model to file cache /tmp/jieba.cache
    Loading model cost 0.851 seconds.
    Prefix dict has been built successfully.
    
    
    ['财经', '财经', '财经', '财经', '财经']
    752476
    

    划分数据集,由于数据过多,测试集增加划分,并乱序

    from sklearn.model_selection import train_test_split
    train_data,test_data,train_label,test_label=train_test_split(data,label,test_size=0.9,shuffle=True)
    print(len(train_data))
    print(train_label[:5])
    
    75247
    ['科技', '股票', '时尚', '体育', '社会']
    

    读取停用词表,在tf-idf提取特征时,选择能表示文本主题的词语作为特征

    with open('data/cn_stop.txt','r',encoding='utf-8') as f:
        stopwords=f.readlines()
    
    
    
    tf_idf=TfidfVectorizer(max_features=20000,stop_words=stopwords)
    tf=tf_idf.fit_transform(data)
    print(tf.shape)
    
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/feature_extraction/text.py:391: UserWarning: Your stop_words may be inconsistent with your preprocessing. Tokenizing the stop words generated tokens ['exp', 'lex', 'sub', 'sup', '①①', '①②', '①③', '①④', '①⑤', '①⑥', '①⑦', '①⑧', '①⑨', '①a', '①b', '①c', '①d', '①e', '①f', '①g', '①h', '①i', '①o', '②①', '②②', '②③', '②④', '②⑤', '②⑥', '②⑦', '②⑧', '②⑩', '②a', '②b', '②c', '②d', '②e', '②f', '②g', '②h', '②i', '②j', '③①', '③⑩', '③a', '③b', '③c', '③d', '③e', '③f', '③g', '③h', '④a', '④b', '④c', '④d', '④e', '⑤a', '⑤b', '⑤d', '⑤e', '⑤f', '一一', '一下', '一个', '一些', '一何', '一切', '一则', '一则通过', '一天', '一定', '一方面', '一旦', '一时', '一来', '一样', '一次', '一片', '一番', '一直', '一致', '一般', '一起', '一转眼', '一边', '一面', '万一', '三天两头', '三番两次', '三番五次', '上下', '上升', '上去', '上来', '上述', '上面', '下列', '下去', '下来', '下面', '不一', '不下', '不久', '不了', '不亦乐乎', '不仅', '不仅仅', '不仅仅是', '不会', '不但', '不光', '不免', '不再', '不力', '不单', '不变', '不只', '不可', '不可开交', '不可抗拒', '不同', '不外', '不外乎', '不够', '不大', '不如', '不妨', '不定', '不对', '不少', '不尽', '不尽然', '不巧', '不已', '不常', '不得', '不得不', '不得了', '不得已', '不必', '不怎么', '不怕', '不惟', '不成', '不拘', '不择手段', '不敢', '不料', '不断', '不日', '不时', '不是', '不曾', '不止', '不止一次', '不比', '不消', '不满', '不然', '不然的话', '不特', '不独', '不由得', '不知不觉', '不管', '不管怎样', '不经意', '不胜', '不能', '不能不', '不至于', '不若', '不要', '不论', '不起', '不足', '不过', '不迭', '不问', '不限', '与其', '与其说', '与否', '与此同时', '专门', '且不说', '且说', '两者', '严格', '严重', '个人', '个别', '中小', '中间', '丰富', '串行', '临到', '为主', '为了', '为什么', '为什麽', '为何', '为止', '为此', '为着', '主张', '主要', '举凡', '举行', '乃至', '乃至于', '之一', '之前', '之后', '之後', '之所以', '之类', '乌乎', '乘势', '乘机', '乘胜', '乘虚', '乘隙', '也好', '也就是说', '也是', '也罢', '了解', '争取', '二来', '二话不说', '二话没说', '于是', '于是乎', '云云', '云尔', '互相', '交口', '产生', '亲口', '亲手', '亲眼', '亲自', '亲身', '人人', '人们', '人家', '人民', '什么', '什么样', '什麽', '仅仅', '今后', '今天', '今年', '今後', '介于', '仍旧', '仍然', '从不', '从严', '从中', '从事', '从今以后', '从优', '从古到今', '从古至今', '从头', '从宽', '从小', '从新', '从无到有', '从早到晚', '从未', '从来', '从此', '从此以后', '从而', '从轻', '从速', '从重', '他人', '他们', '他是', '他的', '代替', '以上', '以下', '以为', '以便', '以免', '以前', '以及', '以后', '以外', '以後', '以故', '以期', '以来', '以至', '以至于', '以致', '任何', '任凭', '任务', '企图', '伙同', '伟大', '传说', '传闻', '似乎', '似的', '但凡', '但愿', '但是', '何乐而不为', '何以', '何况', '何处', '何妨', '何尝', '何必', '何时', '何止', '何苦', '何须', '余外', '作为', '你们', '你是', '你的', '使得', '使用', '例如', '依据', '依照', '依靠', '便于', '促进', '保持', '保管', '保险', '俺们', '倍加', '倍感', '倒不如', '倒不如说', '倒是', '倘使', '倘或', '倘然', '倘若', '借以', '借此', '假使', '假如', '假若', '偏偏', '做到', '偶尔', '偶而', '傥然', '允许', '充其极', '充其量', '充分', '先不先', '先后', '先後', '先生', '光是', '全体', '全力', '全年', '全然', '全身心', '全部', '全都', '全面', '八成', '公然', '共同', '共总', '关于', '其一', '其中', '其二', '其他', '其余', '其后', '其它', '其实', '其次', '具体', '具体地说', '具体来说', '具体说来', '具有', '兼之', '再其次', '再则', '再有', '再次', '再者', '再者说', '再说', '决不', '决定', '决非', '况且', '准备', '凑巧', '凝神', '几乎', '几度', '几时', '几番', '几经', '凡是', '凭借', '出于', '出去', '出来', '出现', '分别', '分头', '分期', '分期分批', '切不可', '切切', '切勿', '切莫', '则甚', '刚好', '刚巧', '刚才', '别人', '别处', '别是', '别的', '别管', '别说', '到了儿', '到处', '到头', '到头来', '到底', '到目前为止', '前后', '前此', '前者', '前进', '前面', '加上', '加之', '加以', '加入', '加强', '动不动', '动辄', '勃然', '匆匆', '十分', '千万', '千万千万', '单单', '单纯', '即令', '即使', '即便', '即刻', '即如', '即将', '即或', '即是说', '即若', '却不', '原来', '又及', '及其', '及时', '及至', '双方', '反之', '反之亦然', '反之则', '反倒', '反倒是', '反应', '反手', '反映', '反而', '反过来', '反过来说', '取得', '取道', '受到', '变成', '古来', '另一个', '另一方面', '另外', '另悉', '另方面', '另行', '只当', '只怕', '只是', '只有', '只消', '只要', '只限', '叫做', '召开', '叮咚', '叮当', '可以', '可好', '可是', '可能', '可见', '各个', '各人', '各位', '各地', '各式', '各种', '各级', '各自', '合理', '同一', '同时', '同样', '后来', '后者', '后面', '向使', '向着', '否则', '吧哒', '呆呆地', '呜呼', '周围', '呵呵', '呼哧', '呼啦', '咱们', '哈哈', '哎呀', '哎哟', '哗啦', '哪个', '哪些', '哪儿', '哪天', '哪年', '哪怕', '哪样', '哪边', '哪里', '哼唷', '唯有', '啊呀', '啊哈', '啊哟', '啪达', '啷当', '喔唷', '嗡嗡', '嘎嘎', '嘎登', '嘿嘿', '因为', '因了', '因此', '因着', '因而', '固然', '在下', '在于', '坚决', '坚持', '基于', '基本', '基本上', '处在', '处处', '处理', '复杂', '多么', '多亏', '多多', '多多少少', '多多益善', '多少', '多年前', '多年来', '多数', '多次', '够瞧的', '大不了', '大举', '大事', '大体', '大体上', '大凡', '大力', '大多', '大多数', '大大', '大家', '大张旗鼓', '大批', '大抵', '大概', '大略', '大约', '大致', '大都', '大量', '大面儿上', '失去', '奋勇', '她们', '她是', '她的', '好在', '好的', '好象', '如上', '如上所述', '如下', '如今', '如何', '如其', '如前所述', '如同', '如常', '如是', '如期', '如果', '如次', '如此', '如此等等', '如若', '始而', '姑且', '存在', '存心', '孰料', '孰知', '宁可', '宁愿', '宁肯', '它们', '它们的', '它是', '它的', '安全', '完全', '完成', '实现', '实际', '宣布', '容易', '密切', '对于', '对应', '对待', '对方', '对比', '将才', '将要', '将近', '少数', '尔后', '尔尔', '尔等', '尚且', '尤其', '就地', '就是', '就是了', '就是说', '就此', '就算', '就要', '尽可能', '尽如人意', '尽心尽力', '尽心竭力', '尽快', '尽早', '尽然', '尽管', '尽管如此', '尽量', '局外', '居然', '届时', '属于', '屡屡', '屡次', '屡次三番', '岂但', '岂止', '岂非', '川流不息', '左右', '巨大', '巩固', '差一点', '差不多', '已矣', '已经', '巴巴', '帮助', '常常', '常言说', '常言说得好', '常言道', '平素', '年复一年', '并不', '并不是', '并且', '并排', '并无', '并没', '并没有', '并肩', '并非', '广大', '广泛', '应当', '应用', '应该', '庶乎', '庶几', '开外', '开始', '开展', '引起', '弹指之间', '强烈', '强调', '归根到底', '归根结底', '归齐', '当下', '当中', '当儿', '当前', '当即', '当口儿', '当地', '当场', '当头', '当庭', '当时', '当然', '当真', '当着', '形成', '彻夜', '彻底', '彼时', '彼此', '往往', '待到', '很多', '很少', '後来', '後面', '得了', '得出', '得到', '得天独厚', '得起', '心里', '必定', '必将', '必然', '必要', '必须', '快要', '忽地', '忽然', '怎么', '怎么办', '怎么样', '怎奈', '怎样', '怎麽', '急匆匆', '怪不得', '总之', '总是', '总的来看', '总的来说', '总的说来', '总结', '总而言之', '恍然', '恐怕', '恰似', '恰好', '恰如', '恰巧', '恰恰', '恰恰相反', '恰逢', '您们', '您是', '惟其', '惯常', '意思', '愤然', '愿意', '慢说', '成为', '成年', '成年累月', '成心', '我们', '我是', '我的', '或则', '或多或少', '或是', '或曰', '或者', '或许', '战斗', '截然', '截至', '所以', '所在', '所幸', '所有', '所谓', '才能', '扑通', '打从', '打开天窗说亮话', '扩大', '抑或', '抽冷子', '拦腰', '按时', '按期', '按照', '按理', '按说', '挨个', '挨家挨户', '挨次', '挨着', '挨门挨户', '挨门逐户', '换句话说', '换言之', '据实', '据悉', '据我所知', '据此', '据称', '据说', '掌握', '接下来', '接着', '接著', '接连不断', '放量', '故意', '故此', '故而', '敞开儿', '敢于', '敢情', '整个', '断然', '方便', '方才', '方能', '方面', '旁人', '无宁', '无法', '无论', '既往', '既是', '既然', '日复一日', '日渐', '日益', '日臻', '日见', '时候', '昂然', '明显', '明确', '是不是', '是以', '是否', '是的', '显然', '显著', '普通', '普遍', '暗中', '暗地里', '暗自', '更为', '更加', '更进一步', '曾经', '替代', '最后', '最大', '最好', '最後', '最近', '最高', '有些', '有关', '有利', '有力', '有及', '有所', '有效', '有时', '有点', '有的', '有的是', '有着', '有著', '朝着', '本人', '本地', '本着', '本身', '权时', '来不及', '来得及', '来看', '来着', '来自', '来讲', '来说', '极为', '极了', '极其', '极力', '极大', '极度', '极端', '构成', '果然', '果真', '某个', '某些', '某某', '根据', '根本', '格外', '次第', '欢迎', '正值', '正在', '正如', '正巧', '正常', '正是', '此中', '此后', '此地', '此处', '此外', '此时', '此次', '此间', '毋宁', '每个', '每天', '每年', '每当', '每时每刻', '每每', '每逢', '比及', '比如', '比如说', '比方', '比照', '比起', '比较', '毕竟', '毫不', '毫无', '毫无例外', '毫无保留地', '沙沙', '没奈何', '没有', '沿着', '注意', '深入', '清楚', '满足', '漫说', '然则', '然后', '然後', '然而', '照着', '牢牢', '特别是', '特殊', '特点', '犹且', '犹自', '独自', '猛然', '猛然间', '率尔', '率然', '现代', '现在', '理应', '理当', '理该', '瑟瑟', '甚且', '甚么', '甚或', '甚而', '甚至', '甚至于', '用来', '由于', '由是', '由此', '由此可见', '略为', '略加', '略微', '白白', '的确', '的话', '皆可', '目前', '直到', '直接', '相似', '相信', '相反', '相同', '相对', '相对而言', '相应', '相当', '相等', '省得', '看上去', '看出', '看到', '看来', '看样子', '看看', '看见', '看起来', '真是', '真正', '眨眼', '着呢', '矣乎', '矣哉', '知道', '确定', '碰巧', '社会主义', '积极', '移动', '究竟', '穷年累月', '突出', '突然', '立刻', '立即', '立地', '立时', '立马', '竟然', '竟而', '第二', '等到', '等等', '策略地', '简直', '简而言之', '简言之', '类如', '精光', '紧接着', '累年', '累次', '纯粹', '纵令', '纵使', '纵然', '练习', '组成', '经常', '经过', '结合', '结果', '绝不', '绝对', '绝非', '绝顶', '继之', '继后', '继续', '继而', '维持', '综上所述', '缕缕', '罢了', '老大', '老是', '老老实实', '考虑', '而且', '而况', '而又', '而后', '而外', '而已', '而是', '而言', '而论', '联系', '联袂', '背地里', '背靠背', '能否', '能够', '自个儿', '自从', '自各儿', '自后', '自家', '自己', '自打', '自身', '至于', '至今', '至若', '般的', '良好', '若夫', '若是', '若果', '若非', '范围', '莫不', '莫不然', '莫如', '莫若', '莫非', '获得', '藉以', '虽则', '虽然', '虽说', '行为', '行动', '表明', '表示', '要不', '要不是', '要不然', '要么', '要是', '要求', '规定', '觉得', '譬喻', '譬如', '认为', '认真', '认识', '许多', '论说', '设使', '设或', '设若', '诚如', '诚然', '话说', '该当', '说明', '说来', '说说', '请勿', '诸位', '诸如', '谁人', '谁料', '谁知', '豁然', '贼死', '赖以', '赶快', '赶早不赶晚', '起先', '起初', '起头', '起来', '起见', '起首', '趁便', '趁势', '趁早', '趁机', '趁热', '趁着', '越是', '路经', '转动', '转变', '转贴', '轰然', '较为', '较之', '较比', '达到', '达旦', '迅速', '过于', '过去', '过来', '运用', '近几年来', '近年来', '近来', '还是', '还有', '还要', '这一来', '这个', '这么', '这么些', '这么样', '这么点儿', '这些', '这会儿', '这儿', '这就是说', '这时', '这样', '这次', '这点', '这种', '这般', '这边', '这里', '这麽', '进入', '进去', '进来', '进步', '进而', '进行', '连同', '连声', '连日', '连日来', '连袂', '连连', '迟早', '迫于', '适应', '适当', '适用', '逐步', '逐渐', '通常', '通过', '造成', '遇到', '遭到', '遵循', '遵照', '避免', '那个', '那么', '那么些', '那么样', '那些', '那会儿', '那儿', '那时', '那末', '那样', '那般', '那边', '那里', '那麽', '部分', '鄙人', '采取', '里面', '重大', '重新', '重要', '鉴于', '针对', '长期以来', '长此下去', '长线', '长话短说', '问题', '间或', '防止', '附近', '陈年', '限制', '陡然', '除了', '除却', '除去', '除外', '除开', '除此', '除此之外', '除此以外', '除此而外', '除非', '随后', '随时', '随着', '随著', '隔夜', '隔日', '难得', '难怪', '难说', '难道', '难道说', '集中', '需要', '非但', '非常', '非徒', '非得', '非特', '非独', '顶多', '顷刻', '顷刻之间', '顷刻间', '顺着', '顿时', '风雨无阻', '首先', '马上', '高低', '高兴', '默然', '默默地', '12', 'li', 'ng昉', 'zxfitl'] not in stop_words.
      'stop_words.' % sorted(inconsistent))
    
    
    (752476, 20000)
    
    test=tf_idf.transform(test_data)
    

    为了增加聚类速度,使用minibatchkmeans,由于sklearn用于实验,如果向工业应用,进一步提高速度,可使用elkan K-Means,两边之和大于第三边减少计算距离运算。

    from sklearn.cluster import MiniBatchKMeans
    k=MiniBatchKMeans(
        init='k-means++',
        batch_size=10,
        n_clusters=10)
    result=k.fit(test)
    pre=result.labels_
    
    print(len(pre))
    print(len(test_label))
    
    677229
    677229
    

    聚类效果评价标准 :纯度,RI兰德基数,ARI调整兰德基数

    from sklearn.metrics import adjusted_rand_score,rand_score
    ari_score=adjusted_rand_score(test_label,pre)
    ri_score=rand_score(test_label,pre)
    print(ari_score)
    print(ri_score)
    
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/metrics/cluster/_supervised.py:389: RuntimeWarning: overflow encountered in long_scalars
      return 2. * (tp * tn - fn * fp) / ((tp + fn) * (fn + tn) +
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/metrics/cluster/_supervised.py:390: RuntimeWarning: overflow encountered in long_scalars
      (tp + fp) * (fp + tn))
    
    
    -1.8037125749433274
    0.4364017709049443
    

    无监督聚类评价标准 silhouete_score 轮廓系数,由于计算过慢,没有增加

    展开全文
  • kmeans聚类分析,无监督学习实现Matlab代码
  • python3 基于Kmeans 文本聚类

    万次阅读 多人点赞 2019-01-03 22:13:10
    聚类(K值,聚类中心,本节涉及的Kmeans方法中心暂时是随机生成,后面会有更新) 第一部分内容,本人暂不祥说,核心的内容,大概如下把 for line in file.readlines(): words = jieba.cut(line) for word in ...

    聚类常规方法,分一下几步:

    • 文本处理,切词、去停用词,文档向量
    • 聚类(K值,聚类中心,本节涉及的Kmeans方法中心暂时是随机生成,后面会有更新)

    第一部分内容,本人暂不祥说,核心的内容,大概如下把

    for line in file.readlines():
        words = jieba.cut(line)
        for word in words:
            # print(word)
            if word not in stopword:
                output.write(word + " ")

    接下来是将上述处理过的文档,进行向量化,此处,我选择的是doc2vec,即是document to vector,文档到向量,这个内容涉及内容也比较多,原理也可以不用了解的那么深,会用就可以了,也没有什么关系,

    # doc2vec
    #训练并保存模型
    def open_file():
        corpus = []
        token_path = "res_title_news.txt"
        try:
    
            with open(token_path, 'r', encoding="utf-8") as t:
                for line in t.readlines():
                    corpus.append(line.strip())
            import gensim
    
            sentences = gensim.models.doc2vec.TaggedLineDocument(token_path)
            model = gensim.models.Doc2Vec(sentences, dm=1, size=200, window=10)
            model.train(sentences, total_examples=model.corpus_count, epochs=100)
            model.save('res_title_news_w2c.txt')
            out = open('res_title_news_vector.txt', 'w')
            for idx, docvec in enumerate(model.docvecs):
                for value in docvec:
                    out.write(str(value) + ' ')
                out.write('\n')
        except Exception as e:
            print(e)
    
    open_file()
    
    

    上面包含模型的训练与保存,会把当中文档向量的部分,放入到res_title_news_vector.txt中,打开这个文本文件之后,你会看到每一篇文档被训练成了200维度的向量。

    那么模型训练好之后,接下来的是就是使用模型训练的向量,来完成Kmeans聚类,那么这个聚类是怎么做的尼?

    import gensim
    from gensim.models.doc2vec import Doc2Vec, LabeledSentence
    
    def test_km():
        model = gensim.models.Doc2Vec.load("res_title_news_vector.txt")#加载模型
        from sklearn.cluster import KMeans
        for k in range(5,20):
            clf = KMeans(n_clusters=k, n_init=20, init='k-means++', n_jobs=4)#n_init选择质心的次数,返回最好的结果
            s = clf.fit(model.docvecs)
    
            # 20个中心点位置
        #     print(clf.cluster_centers_)
    
            # 每个样本所属的簇,
            print(clf.labels_)
            i = 1
            while i <= len(clf.labels_):
        #         print(i, clf.labels_[i - 1])
                i = i + 1
            # 每个点,到簇类中心的距离之和,用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
            print(clf.inertia_)
    test_km() 

    这里我进行了多次K值的设定,想重上述的结果中,找到最好的结果。

    结果表明当K=12时,效果较好。这个值是根据clf.inertia_(即簇内平方和SSE,每一个样本点到簇中心的距离之和)来确定,即手肘法(此部分,来自实验室成员所写:手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。)

    [ 3  8 13 13 11  6 13  0  0  5  3  1  5 13  6  0  0 12  4 15 12  6  1  9  7
      8  8  6  7 12  4 11 11  4  3 15  0  0  5  3  5  4 12  1  4 12 11 10 12 13
     12  4 15  4  4  8 11  0  0  5  3  6 11 11  4  4 13 11 13  0  4 10  4  2  2
      3  3 13  4  4  2 15 12 12 15  9 13  8  3  0 12  6  3  2  0 15 11  2 12 15
      2  8 15 15 15 13  4 10  4  3  3  2 14 12 13 12  4 13  5  5  4 14  3  1 12
      4  1  4  2  3 11 13  2  4 12  6  6  1  1  2  6 11 12 13 13  2 15 11  9 11
     11 15  5  1 15 15 12 15 12 13 15 11 15 11 11  3 15 11 12 15 11 15  5 15 15
     15 15 15 15 11 15 15  5 15 15 15 15  1 15 14 14 14 14 14 14 14 14 14 14 14
     14 14 14 13 14  0 14  6 14 14  6  8  7  6  6  0 14  7  8  6  7  0 14  4  6
      7  0  7  7  6  8  6  3  3  0  2  2  8  8  3  3  6  0  6  0]

    得到上述聚类结果后,依然看不出到底聚类效果怎么样,是否把同一主题的文本聚成一类,那么为了方便分析聚类结果,我们将文本所属簇与文本内容,一起展示出来,一探究竟,看看具体属于哪一类?

    我们将此拼接成一个【K, text】形式,K即是文本所属的簇,text即是文本;

    我们借用以下方法,此处是我测试的一个文本量很小的例子:输出结果是从小到大进行排序的,根据K值进行排序;

    import numpy as np
    x=np.array([1,0,0,2,2,0])
    file = open('cute.txt','r', encoding='utf-8')
    data = file.readlines()#同样是一个列表
    # print(data[3])
    index = x.argsort()#根据指针对x排序,[1,2,5,0,3,4]
    print(index)
    for i in range(len(index)):
        print(x[index[i]], data[index[i]])
    

    前面的整数是聚类的结果,后面是对应的文本,这样便于获取当前聚类的主题。

    当我们获取到每一个簇中的文本,我们可以根据NLP技术,分析每一个簇的主题,或者是根据TFIDF方法,获取每个簇的关键词,根据关键词,进行主题的呈现。

    下一章,我将继续写初始化质心的内容,如何设定Kmeans的初始化质心,以提升聚类效果和聚类性能!

    展开全文
  • Kmeans文本聚类

    2021-05-21 07:00:59
    1、数据准备:文本按行存储,分词以空格分割;2、embedding:使用word2vec计算每个词组的embedding;./word2vec -train src.txt -output dst.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -...

    1、数据准备:

    文本按行存储,分词以空格分割;

    2、embedding:

    使用word2vec计算每个词组的embedding;

    ./word2vec -train src.txt -output dst.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 2 -binary 0

    ./word2vec -train src.txt -output dst.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 2 -binary 1

    3、IDF计算:

    TF-IDF = 词频(TF) x 逆向文档频率(IDF)

    568cde90fc378b355fc7c30c1547c52a.png

    4、样本归一:

    计算文章标题向量所有元素之和;

    文章标题向量每个元素除以向量和;

    结果写入新建文章标题向量;

    5、构建样本:

    计算每个单词(汉字)归一值与相似度TOP(n)的乘积,生成n个元素的向量;

    将每个单词(汉字)的向量元素逐一相加求和,生成该文章标题对应的向量;

    6、训练模型:

    def do_texts_kmeans(data):

    '''训练Kmeans模型'''

    kmeans = KMeans(n_clusters=zyb_cluster, max_iter=zyb_maxiter)

    kmeans.fit(data)

    return kmeans

    7、保存模型:

    def do_kmeans_model(kmeans):

    '''保存Kmeans模型'''

    pickle.dump(kmeans, open(file, "wb"))

    8、模型预测:

    def do_texts_predict(data):

    '''预测Kmeans模型'''

    kmeans = pickle.load(open(file, "rb"))

    return [kmeans.predict([line]) for line in data]

    9、主体流程:

    构建分词矩阵 -> 计算单词词频 -> 构建分词字典 -> 构建文档向量 -> 生成TFIDF结果 -> 生成归一化结果 -> 构建训练数据 -> 生成Kmeans模型 -> 输出Kmeans模型

    展开全文
  • 通过Kmeans的方法对故障类型进行一个简单的聚类,由于不确定数据可以划分的组数,利用Calinski-Harabasz指数判断数据的最佳分类组数,并对最终的结果进行简单的可视化
  • k-均值算法是一个很常见的算法,它的基本思想是:通过迭代寻找k个聚类的一个划分方案,使得用这K个聚类的均值来代表相应各个样本时所得的总体误差最小。 算法步骤: 1.生成索引文件 将分类的文本以句子id 句子...
  • sklearn之kmeans文本聚类主题输出

    千次阅读 2018-12-31 14:49:34
    from sklearn import feature_extraction from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import ...from sklearn.cluster import KMeans corpu...
  • Spark-KMeans文本聚类

    千次阅读 2016-01-07 11:30:28
    文本聚类可以用于生成一篇简明扼要的摘要文档;对搜索引擎返回的结果进行聚类,使用户迅速定位到所需要的信息;对用户感兴趣的文档(如用户浏览器 cache 中的网页)聚类,从而发现用户的兴趣模式并用于 信息过滤 和...
  • 本文主要讲述以下几点: 1.通过scikit-learn计算文本内容的tfidf并构造N*M...调用scikit-learn中的K-means进行文本聚类; 3.使用PAC进行降维处理,每行文本表示成两维数据; 4.最后调用Matplotlib显示聚类效果图。
  • 文本进行聚类文本预处理-->构造特征向量-->聚类,压缩包内含有实验用语料亲测可用, 谢谢支持。
  • 文本聚类 1. TFIDF TFIDF全程叫做term frequency–inverse document frequency,即文本频率与逆文档频率指数, TFIDF就是为了表征一个token的重要程度,如果这个token出现的频数很高,出现的频数这个因素就叫做TF,...
  • 直接上代码 # -*- coding: utf-8 -*- import jieba from sklearn.feature_extraction.text import CountVectorizer ...from sklearn.cluster import KMeans from sklearn.decomposition import PCA,KernelPCA import
  • 利用K-means算法实现聚类分析可视化
  • # -*- coding:utf-8 -* #本代码是在jupyter notebook上实现,...#本脚本主要实现了基于python通过kmeans做的文本聚类的项目目的 #导入相关包 import numpy as np import pandas as pd import re import os import c...
  • 文本聚类(二)—— KMeans 聚类

    千次阅读 2020-10-13 15:07:22
    目录二、KMeans 聚类2.1 加载数据集2.2 数据清洗2.3 文本向量化2.4 文本聚类2.5 关键词展示2.6 判定最佳聚类数参考文档 这第一篇内容中,我们介绍了 LDA 主题模型,这一篇,我们将介绍经典的 KMeans 聚类算法在文本...
  • Kmeans 文本聚类

    2013-11-25 22:26:53
    https://github.com/shenguojun/hadoop/blob/master/WebKmeans/src/edu/sysu/shen/hadoop/Kmeans.java Canopy算法 http://blog.csdn.net/july_2/article/details/8905502
  • 1、问题导入假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置。事先肯定要做好攻略,...而本文所提供的k-means聚类分析方...
  • 文本聚类kmeans

    2021-02-20 16:56:12
    最近做一些文本挖掘的项目,其中用到了文本聚类相关算法,比如kmeans. 就kmeans算法做一些简单记录. Kmeans是一种非常常见的聚类算法, 算法的核心思想非常简单. 1.给定K个类别,选取K个中心点 2.对于任意其他数据,...
  • 本文主要讲述文本聚类相关知识,包括中文分词、数据清洗、特征提取、TF-IDF、KMeans聚类等步骤。 本篇文章为基础性文章,希望对你有所帮助,提供些思路,也是自己教学的内容。如果文章中存在错误或不足之处,还请...
  • python 文本聚类分析案例说明摘要1、结巴分词2、去除停用词3、生成tfidf矩阵4、K-means聚类5、获取主题词 / 主题词团 说明 实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。 实验思路:将数据进行预处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,273
精华内容 2,109
关键字:

kmeans文本聚类

友情链接: qtspeech-5.10.zip