最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用K-means實(shí)現(xiàn)文本聚類功能

 更新時(shí)間:2024年11月03日 08:53:06   作者:IT果果日記  
最近遇到了這樣一個(gè)需求,將N個(gè)文本內(nèi)容聚類成若干個(gè)主題詞團(tuán),減少人工分析文本和分類文本的工作量,實(shí)現(xiàn)思路是使用?K-means算法通過(guò)高頻詞對(duì)文本內(nèi)容進(jìn)行聚類,K-means算法實(shí)現(xiàn)原理簡(jiǎn)單易于理解,本文給大家介紹了Python使用K-means實(shí)現(xiàn)文本聚類功能,需要的朋友可以參考下

前言

最近遇到了這樣一個(gè)需求,將N個(gè)文本內(nèi)容聚類成若干個(gè)主題詞團(tuán),減少人工分析文本和分類文本的工作量。

實(shí)現(xiàn)思路是使用 K-means算法通過(guò)高頻詞對(duì)文本內(nèi)容進(jìn)行聚類,K-means算法實(shí)現(xiàn)原理簡(jiǎn)單易于理解,缺點(diǎn)是詞與詞之間的順序性和相互關(guān)系不能在分類中得到體現(xiàn)。實(shí)現(xiàn)步驟如下:

  • 使用 jieba對(duì)文本內(nèi)容進(jìn)行分詞處理;
  • 去掉停用詞;
  • 使用 TF-IDF算法將上一步過(guò)濾后的分詞列表轉(zhuǎn)換成矩陣形式;
  • 使用 K-means聚類算法對(duì)矩陣計(jì)算相似性;
  • 獲取每個(gè)聚類的主題詞/詞團(tuán);

準(zhǔn)備樣本

周杰倫的30首歌曲的歌詞金句作為我們聚類樣本的內(nèi)容,保存到 sourceData/周杰倫.txt 文本中。

分詞

使用 python的 pip安裝結(jié)巴分詞組件

pip install jieba

定義一個(gè)函數(shù)方法,讀取 周杰倫.txt文件,并對(duì)文件內(nèi)容的每一行文本做分詞處理。

import jieba

def get_jiebaword():
    try:
        with open('sourceData/周杰倫.txt', "r", encoding='utf-8') as fr:
            lines = fr.readlines()
    except FileNotFoundError:
        print("找不到此文件")
    jiebaword = []
    for line in lines:
        line = line.strip('\n')
        # 清除多余的空格
        line = "".join(line.split())
        # 默認(rèn)精確模式
        seg_list = jieba.cut(line, cut_all=False)
        word = "/".join(seg_list)
        jiebaword.append(word)
    return jiebaword

分詞后的文本列表,打印出來(lái)如圖所示:

停用詞

停用詞是一些沒(méi)有具體含義但在文本中經(jīng)常會(huì)出現(xiàn)的詞語(yǔ),例如“的”、“是”、“許多”、“不僅”等。

中文停用詞我們可以去網(wǎng)上下載,地址如下:

https://gitcode.com/open-source-toolkit/63e0e/overview

下載后的停用詞在一個(gè) hit_stopwords.txt 文件中,如圖所示:

停用詞不只是只有文字,也包括一些標(biāo)點(diǎn)符號(hào)。

定義一個(gè)函數(shù)方法讀取停用詞。

def get_stopword():
    stopword = []
    try:
        with open('sourceData/hit_stopwords.txt', "r", encoding='utf-8') as fr:
            lines = fr.readlines()
    except FileNotFoundError:
        print("找不到此文件")
    for line in lines:
        line = line.strip('\n')
        stopword.append(line)
    return stopword

定義一個(gè)函數(shù)方法從樣本分詞列表中過(guò)濾掉停用詞,過(guò)濾后的結(jié)果保存到 CleanWords.txt 文件中。

def clean_stopword(jiebaword, stopword):
    fw = open('resultData/周杰倫/CleanWords.txt', 'a+', encoding='utf-8')
    for words in jiebaword:
        words = words.split('/')
        for word in words:
            if word not in stopword:
                fw.write(word + '\t')
        fw.write('\n')
    fw.close()

CleanWords.txt 文件如圖所示。

如果發(fā)現(xiàn)CleanWords.txt 文件中還有一些詞語(yǔ)會(huì)影響聚類的效果,可以使用如下語(yǔ)句添加停用詞。

for i in range(30):
    stopword.append(str(i+1))
    
stopword.append('一路')
stopword.append('向北')

TF-IDF算法

為了讓計(jì)算機(jī)能夠理解詞語(yǔ)的相似度,我們可以將文本格式的數(shù)據(jù)轉(zhuǎn)換成矩陣類型的數(shù)據(jù), TF-IDF矩陣在這方面是應(yīng)用最為廣泛的。

TF-IDF(Term Frequency-Inverse Document Frequency,詞頻-逆文檔頻率)是一種在信息檢索和文本挖掘領(lǐng)域廣泛使用的統(tǒng)計(jì)方法,用于評(píng)估一個(gè)詞在文檔或語(yǔ)料庫(kù)中的重要程度。

  • TF 詞頻,表示某個(gè)詞在文檔中出現(xiàn)的頻率。詞頻反映了詞語(yǔ)在文檔中的重要性,出現(xiàn)次數(shù)越多,TF值越高。計(jì)算公式:

  • IDF 逆文檔頻率,表示某個(gè)詞在整個(gè)文檔集合中的稀有程度。逆文檔頻率反映了詞語(yǔ)在整個(gè)文檔集合中的普遍性,出現(xiàn)次數(shù)越多的詞,IDF值越低;反之,則越高。計(jì)算公式:

包含詞t的文檔書(shū) +1 是為了防止除以 0 導(dǎo)致溢出。

總結(jié)一下 TF-IDFTF 表示相同的詞在兩篇文章中出現(xiàn)的頻次越高,兩篇文章越相似; IDF 表示某個(gè)詞在所有文本中出現(xiàn)次數(shù)較少,只在某兩篇文章中出現(xiàn)幾次,則該兩篇文章具有較高相似度。

scikit-learn 已經(jīng)實(shí)現(xiàn)了 TF-IDF 算法,我們首先要安裝scikit-learn 組件。

pip install scikit-learn

使用python 實(shí)現(xiàn),定義一個(gè)函數(shù)方法生成 TF-IDF 矩陣。

from sklearn.feature_extraction.text import TfidfVectorizer

def get_tfidf():
    try:
        with open('resultData/周杰倫/CleanWords.txt', "r", encoding='utf-8') as fr:
            lines = fr.readlines()
    except FileNotFoundError:
        print("找不到此文件")
    transformer = TfidfVectorizer()
    tfidf = transformer.fit_transform(lines)
    # 轉(zhuǎn)為數(shù)組形式
    tfidf_arr = tfidf.toarray()
    return tfidf_arr

打印輸出的矩陣,如下圖所示:

這個(gè)矩陣的形狀是 30 * 217 ,它表示 217 個(gè)分詞在 30 個(gè)文本中的 TF-IDF 值,值為0表示在此文章中沒(méi)有出現(xiàn)過(guò)。由于打印的不是完整的矩陣,所以上圖中的矩陣沒(méi)有將非0的值顯示出來(lái)。

K-means聚類

K-Means 聚類是一種常用的無(wú)監(jiān)督學(xué)習(xí)算法,用于將數(shù)據(jù)集分成K個(gè)簇(cluster),使得簇內(nèi)的數(shù)據(jù)點(diǎn)彼此之間盡可能相似,而簇間的數(shù)據(jù)點(diǎn)盡可能不同。 K-Means 算法的目標(biāo)是最小化簇內(nèi)數(shù)據(jù)點(diǎn)到簇中心的距離之和。

我們需要使用 nltk 組件調(diào)用 K-Means 算法。

pip install nltk

定義一個(gè)函數(shù)方法,獲取K-Means 聚類。

from nltk.cluster import KMeansClusterer, cosine_distance
import pandas as pd

def get_cluster(tfidf_arr, k):
    kmeans = KMeansClusterer(num_means=k, distance=cosine_distance, avoid_empty_clusters=True)  # 分成k類,使用余弦相似分析
    kmeans.cluster(tfidf_arr)
    # 獲取分類
    kinds = pd.Series([kmeans.classify(i) for i in tfidf_arr])
    
    fw = open('resultData/周杰倫/ClusterText.txt', 'a+', encoding='utf-8')
    for i, v in kinds.items():
        fw.write(str(i) + '\t' + str(v) + '\n')
    fw.close()

聚類結(jié)果保存在 ClusterText.txt 文件中,結(jié)果如圖所示:

圖中有兩列數(shù)字,第一列數(shù)字是從0到29按順序排列的數(shù)字,表示30個(gè)文本的序號(hào)。第二列數(shù)字表示5個(gè)聚類的序號(hào) 0~4。

獲取主題詞

前面幾步已經(jīng)得到了對(duì)周杰倫歌詞的聚類索引,但是我們并不清楚這些聚類索引代表什么含義,所以我們可以將這5個(gè)聚類里詞頻最高的幾個(gè)詞給提取出來(lái)。

定義一個(gè)函數(shù)方法,獲取分類文檔。

def cluster_text(text_cnt):
    index_cluser = []
    try:
        with open('resultData/周杰倫/ClusterText.txt', "r", encoding='utf-8') as fr:
            lines = fr.readlines()
    except FileNotFoundError:
        print("找不到此文件")
    for line in lines:
        line = line.strip('\n')
        line = line.split('\t')
        index_cluser.append(line)
    # index_cluser[i][j]表示第i行第j列
    try:
        with open('resultData/周杰倫/CleanWords.txt', "r", encoding='utf-8') as fr:
            lines = fr.readlines()
    except FileNotFoundError:
        print("找不到此文件")
    for index, line in enumerate(lines):
        for i in range(text_cnt):
            if str(index) == index_cluser[i][0]:
                fw = open('resultData/周杰倫/cluster' + index_cluser[i][1] + '.txt', 'a+', encoding='utf-8')
                fw.write(line)
    fw.close()

將30個(gè)歌詞文本的聚類結(jié)果分別放入5個(gè)文件中。

其中一個(gè)cluster文件結(jié)果如下:

得到以上分類文檔以后,再分別統(tǒng)計(jì)各個(gè)聚類中頻次最高的幾個(gè)詞,定義一個(gè)函數(shù)方法,代碼如下:

from collections import Counter

def get_title(cluster, top_n=5):
    fw = open('resultData/周杰倫/title.txt', 'a+', encoding='utf-8')

    for i in range(cluster):
        try:
            with open('resultData/周杰倫/cluster' + str(i) + '.txt', "r", encoding='utf-8') as fr:
                lines = fr.readlines()
        except FileNotFoundError:
            print("找不到此文件")
        all_words = []
        for line in lines:
            line = line.strip('\n')
            line = line.split('\t')
            for word in line:
                all_words.append(word)
        c = Counter()
        for x in all_words:
            if len(x) > 1 and x != '\r\n':
                c[x] += 1

        print('主題' + str(i) + '----------------------------------------------------\n詞頻統(tǒng)計(jì)結(jié)果:\n')
        fw.write('主題' + str(i) + '----------------------------------------------------\n詞頻統(tǒng)計(jì)結(jié)果:\n')
        # 輸出詞頻最高的那個(gè)詞,也可以輸出多個(gè)高頻詞
        for (k, v) in c.most_common(top_n):
            print(k, ':', v, '\n')
            fw.write(k + ':' + str(v) + '\n')
        fw.write('\n')

    fw.close()

執(zhí)行結(jié)果保存在 title.txt 文件中,我這里參數(shù) top_n 是傳的3,表示獲取3個(gè)主題詞,效果如圖所示:

因?yàn)闃颖咀龅谋容^少,所以詞頻統(tǒng)計(jì)的數(shù)量不多,所以代表性也不是很強(qiáng)。另一個(gè)原因是 K-means 算法是一種無(wú)監(jiān)督算法,一開(kāi)始要定義好聚類的數(shù)量,算法根據(jù)聚類的數(shù)量隨機(jī)選取聚類中心點(diǎn),中心點(diǎn)選的不準(zhǔn)會(huì)極大影響聚類結(jié)果的準(zhǔn)確度。所以可以定義不同的聚類數(shù)量多計(jì)算幾次,直到滿意為止。

主流程方法

主流程 main 方法基本是調(diào)用上文中列表的所有函數(shù)方法,按步驟開(kāi)始執(zhí)行。

此外,還定義了一個(gè) delete_files_in_directory 函數(shù)用來(lái)在生成聚類結(jié)果之前先刪除上一次生成的結(jié)果,否則生成的結(jié)果txt文件會(huì)疊加上一次的結(jié)果。

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.cluster import KMeansClusterer, cosine_distance
import pandas as pd
from collections import Counter
import os

def delete_files_in_directory(directory):
    if not os.path.exists(directory):
        os.mkdir(directory)
        return
    # 遍歷目錄中的所有文件
    for filename in os.listdir(directory):
        file_path = os.path.join(directory, filename)
        # 檢查路徑是否為文件(而非子目錄等)
        if os.path.isfile(file_path):
            # 刪除文件
            os.remove(file_path)

if __name__ == '__main__':
    # 定義聚類的個(gè)數(shù)
    cluster = 5
    # 定義主題詞個(gè)數(shù)
    top_n = 3

    # 刪除上一次的結(jié)果數(shù)據(jù)
    delete_files_in_directory('resultData/周杰倫')

    # 結(jié)巴分詞
    jiebaword = get_jiebaword()

    # 獲取停用詞
    stopword = get_stopword()

    # ---停用詞補(bǔ)充,視具體情況而定---
    for i in range(30):
        stopword.append(str(i+1))

    stopword.append('一路')
    stopword.append('向北')

    # ----------------------
    # 去除停用詞
    clean_stopword(jiebaword, stopword)

    # 獲取tfidf矩陣
    tfidf_arr = get_tfidf()
    text_cnt = tfidf_arr.shape[0]

    # ---輸出測(cè)試---
    # print(tfidf_arr)
    # print(tfidf_arr.shape)
    # -------------

    # K-means聚類
    get_cluster(tfidf_arr, cluster)

    # 獲取分類文件
    cluster_text(text_cnt)

    # 統(tǒng)計(jì)出主題詞
    get_title(cluster, top_n)

以上就是Python使用K-means實(shí)現(xiàn)文本聚類功能的詳細(xì)內(nèi)容,更多關(guān)于Python K-means文本聚類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python操作PostgreSQL數(shù)據(jù)庫(kù)的基本方法(增刪改查)

    Python操作PostgreSQL數(shù)據(jù)庫(kù)的基本方法(增刪改查)

    PostgreSQL數(shù)據(jù)庫(kù)是最常用的關(guān)系型數(shù)據(jù)庫(kù)之一,最吸引人的一點(diǎn)是它作為開(kāi)源數(shù)據(jù)庫(kù)且具有可拓展性,能夠提供豐富的應(yīng)用,這篇文章主要給大家介紹了關(guān)于Python操作PostgreSQL數(shù)據(jù)庫(kù)的基本方法,文中介紹了連接PostgreSQL數(shù)據(jù)庫(kù),以及增刪改查,需要的朋友可以參考下
    2023-09-09
  • pycharm運(yùn)行按鈕灰色問(wèn)題及解決

    pycharm運(yùn)行按鈕灰色問(wèn)題及解決

    這篇文章主要介紹了pycharm運(yùn)行按鈕灰色問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳解Python列表extend()函數(shù)使用方法

    詳解Python列表extend()函數(shù)使用方法

    這篇文章主要介紹了Python列表extend()函數(shù)的使用方法,文章通過(guò)代碼示例介紹的非常詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 利用python來(lái)跟蹤ip地址的方法

    利用python來(lái)跟蹤ip地址的方法

    今天來(lái)介紹一個(gè)流行的 python庫(kù) ip2geotools,使用它可以確定 IP地址 對(duì)應(yīng)的 國(guó)家、地區(qū)、城市、緯度和經(jīng)度等,文中通過(guò)代碼示例介紹了如何使用python來(lái)跟蹤ip地址,需要的朋友可以參考下
    2023-06-06
  • pytorch下tensorboard的使用程序示例

    pytorch下tensorboard的使用程序示例

    我們都知道tensorflow框架可以使用tensorboard這一高級(jí)的可視化的工具,這篇文章主要介紹了pytorch下tensorboard的使用,需要的朋友可以參考下
    2021-10-10
  • 如何使用七牛Python SDK寫(xiě)一個(gè)同步腳本及使用教程

    如何使用七牛Python SDK寫(xiě)一個(gè)同步腳本及使用教程

    七牛云存儲(chǔ)的 Python 語(yǔ)言版本 SDK(本文以下稱 Python-SDK)是對(duì)七牛云存儲(chǔ)API協(xié)議的一層封裝,以提供一套對(duì)于 Python 開(kāi)發(fā)者而言簡(jiǎn)單易用的開(kāi)發(fā)工具本篇文章給大家介紹如何使用七牛Python SDK寫(xiě)一個(gè)同步腳本及使用及使用教程,需要的朋友可以參考下
    2015-08-08
  • Python實(shí)現(xiàn)語(yǔ)音識(shí)別Whisper的使用示例

    Python實(shí)現(xiàn)語(yǔ)音識(shí)別Whisper的使用示例

    Whisper是由OpenAI基于Python開(kāi)發(fā)的能夠識(shí)別多國(guó)語(yǔ)言的語(yǔ)音識(shí)別模型,本文主要介紹了Python實(shí)現(xiàn)語(yǔ)音識(shí)別Whisper的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 利用20行Python 代碼實(shí)現(xiàn)加密通信

    利用20行Python 代碼實(shí)現(xiàn)加密通信

    這篇文章主要介紹了利用Python 代碼實(shí)現(xiàn)加密通信,本文用 20 行 Python 代碼來(lái)演示加密、解密、簽名、驗(yàn)證的功能。大家依樣畫(huà)葫蘆,不僅能理解加密技術(shù),更能自己實(shí)現(xiàn)一套加密通信機(jī)制,需要的朋友可以參考一下
    2022-03-03
  • react+django清除瀏覽器緩存的幾種方法小結(jié)

    react+django清除瀏覽器緩存的幾種方法小結(jié)

    今天小編就為大家分享一篇react+django清除瀏覽器緩存的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python數(shù)據(jù)處理利器Pandas?DataFrame常用操作

    Python數(shù)據(jù)處理利器Pandas?DataFrame常用操作

    這篇文章主要為大家介紹了Python數(shù)據(jù)處理利器Pandas?DataFrame,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論

安龙县| 大连市| 石林| 蓬莱市| 娱乐| 昌平区| 华宁县| 上犹县| 屯留县| 安达市| 永靖县| 乐清市| 林州市| 江津市| 长泰县| 武宁县| 阳山县| 保山市| 陕西省| 沙雅县| 石嘴山市| 衢州市| 迁西县| 阜平县| 宜川县| 东安县| 夏邑县| 遂昌县| 稻城县| 仁化县| 山阴县| 江口县| 闽清县| 班玛县| 宾阳县| 天水市| 阳西县| 沁阳市| 金秀| 唐河县| 揭阳市|