電商評論數據聚類實驗報告


電商評論數據聚類實驗報告——馮煜博

目錄

  1. 實驗目的
  2. 整體思路
  3. 數據介紹
  4. 代碼與實驗步驟
    4.1 爬蟲代碼
    4.2 數據清洗
    4.3 分詞
    4.4 去停用詞
    4.5 計算TF-IDF詞頻與聚類算法應用
    4.6 生成詞雲圖
  5. 實驗結果
    5.1 詞雲圖
    5.2 聚類結果分析
  6. 不足與反思
  7. 參考資料

1. 實驗目的

掌握無監督學習問題的一般解決思路和具體解決辦法;
熟悉 python sklearn 庫的使用方法

2. 整體思路

首先,通過 python 爬蟲下載電商網站上關於某產品的用戶評論數據;
其次,清洗數據(移除表情符號等)、分詞、去停用詞;
再次,計算每條評論的 TF-IDF 詞頻,使用 KMeans 算法進行聚類;
最后,通過詞雲工具,生成每個分類的詞雲圖。

3. 數據介紹

電商評論數據選自京東 kindle 產品的全部用戶評論,排序順序為“推薦”。

4. 代碼與實驗步驟

4.1 爬蟲代碼

每頁輸出10條評論,遍歷100頁

# !/usr/bin/python
# -*- coding: utf-8 -*-

import urllib.request
import time

if __name__ == "__main__":
	# JD的數據是以GBK編碼的
    f = open("jd-comments-json.txt", mode="w", encoding="gbk")
    for i in range(100):
		# 每頁數據量為 50 條
        url = "https://sclub.jd.com/comment/productPageComments.action?productId=2002883&score=0&sortType=5&page=" + str(i) + "&pageSize=10"
        ret = urllib.request.urlopen(url).read().decode("gbk")
        f.write("%s\n" % ret)
        print("%d %s" % (i, ret))
        time.sleep(i % 2) # 爬蟲的節操:不能拖垮人家的數據庫

4.2 數據清洗

主要是去除表情符號,因為表情符號存在的情況不多,所以這部分工作是手動進行的。
評論數據是以 JSON 格式從京東上面下載的,所以需要對JSON進行解析。

# !/usr/bin/python
# -*- coding: utf-8 -*-

import json

if __name__ == "__main__":
    f_comment = open("comments.txt", encoding="gbk", mode="w")
    with open("jd-comments-json.txt", encoding="gbk") as f:
        for line in f:
            s = json.loads(line.strip())
            comments = s["comments"]
            for comment in comments:
                content = comment['content'].replace("\n", "")
                f_comment.write("%s\n" % content)

4.3 分詞

分詞工具使用的是哈工大開發的語言技術平台雲,通過 REST 調用的方式對每一條評論都分好了詞。

# !/usr/bin/python
# -*- coding: utf-8 -*-

import urllib.request
import urllib.parse
import time

def word_seg(sentence):
    url = "http://api.ltp-cloud.com/analysis/"
    args = {
        "api_key" : "your-api-key",
        'text' : sentence,
        'format' : 'plain',
        'pattern' : 'ws'
    }
    ret = urllib.request.urlopen(url, urllib.parse.urlencode(args).encode(encoding="utf-8"))
    return ret.read().decode(encoding="utf-8")

if __name__ == "__main__":
    f_in = open("comments-utf8.txt", encoding="utf8")
    f_out = open("comments-ws.txt", encoding="utf-8", mode="w")
    for line in f_in:
        ret = word_seg(line.strip()).replace("\n", "  ")
        print(ret)
        f_out.write("%s\n" % ret)
        time.sleep(0.5)

4.4 去停用詞

去掉分詞結果中:的、了,以及各種標點符號。

# !/usr/bin/python
# -*- coding: utf-8 -*-

stop_word = ("的", "了",",", "、", "。", ";", "!", "*", ":", "~")

f_out = open("comments-processed.txt", encoding="utf-8", mode="w")
with open("comments-ws.txt", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        sen = ""
        for c in line:
            if c not in stop_word:
                sen = sen + c
        for word in sen.split(" "):
            if len(word) != 0:
                f_out.write("%s  " % word)
        f_out.write("\n")

4.5 計算TF-IDF詞頻與聚類算法應用

本部分代碼參考了CSDN博客\(^{[2]}\)

# !/usr/bin/python
# -*- coding: utf-8 -*-

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans

if __name__ == "__main__":
    corpus = list()
    with open("comments-processed.txt", encoding="utf-8") as f:
        for line in f:
            corpus.append(line.strip())

    vectorizer = CountVectorizer()
    transformer = TfidfTransformer()
    tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))

    word = vectorizer.get_feature_names()
    weight = tfidf.toarray()

    clf = KMeans(n_clusters=5)  # 假設數據內在地分為 5 組
    resul = clf.fit(weight)

    with open("comments-processed.txt", encoding="utf-8") as f:
        for i, line in enumerate(f):
            group = clf.labels_[i]
            f = open("group-" + str(group) + ".txt", encoding="utf-8", mode="a")
            f.write("%s" % line)
            f.close()

該代碼將生成 5 份對評論聚類后的文件,分別是 group-0.txt,group-1.txt,......,group-4.txt。
其中,每個文件的內容都將是改組別下的評論數據。

4.6 生成詞雲圖

采用了一款工具\(^{[3]}\),而沒有使用代碼實現。

5 實驗結果

5.1 詞雲圖

5.1.1 第 0 組詞雲圖

5.1.2 第 1 組詞雲圖

5.1.3 第 2 組詞雲圖

5.1.4 第 3 組詞雲圖

5.1.5 第 4 組詞雲圖

5.2 聚類結果分析

5.2.1 第 1 組

共 89 條記錄,舉例如下:
確實 不錯 比 手機 看 書 好 多 了 不 刺眼 可以 總 郵箱 把 TXT 傳 到 這 上面 自動 就 轉換 了 挺 方便
很 不錯 東東 主要 是 比 實體 書 帶 着 方便 很多
很 好 用 跟 紙張 看 書 效果 很 像 攜帶 也 很 方便

5.2.2 第 2 組

共 167 條記錄,舉例如下:
確實 不錯 感覺 比 平板省 眼睛 而且 這個 續航 比較 牛 確實 不錯
送貨 速度 快 價廉物美 有 了 這個 看 書 眼睛 就 不 會 很 累 真 不錯

5.2.3 第 3 組

共 117 條記錄,舉例如下:
寶貝 很 好 看 書 很 舒服 不 似 手機 一樣 會 眼睛 疲勞 干澀 這 是 我 第一 部 閱讀器 很 喜歡 也 經常 在 京東 買 東西 一直 很 滿意
喜歡 小巧 輕便 可以 盡情 看看看 了 再 也 不 擔心 眼睛 痛 問題 了 看 一 下午 眼睛 疲憊感 還 好

5.2.4 第 4 組

共 77 條記錄,舉例如下:
東西 很 好 也 沒有 出現 亮點 很 完美 物流 也 很快
東西 還 不錯 就是 就是 反應 有 點 慢

5.2.5 第 5 組

共 548 條記錄,舉例如下:
kindl 讀書 裝 B 一條龍 服務
一直 沒 買 kendle 這 次 買 回來

6.不足與反思

  1. 寫爬蟲時我沒有考慮到“中評”、“差評”的情況,所以該實驗的數據集是有偏見的;
  2. 由於時間倉促,沒有使用對評論數據分類效果最好的 \(懲罰GMM聚類算法^{[1]}\)
  3. 即便是對評論進行了聚類,但是聚類的結果從實際的角度來考慮,並沒有發現其用處;
  4. 考察聚類結果發現,各個類別下面的數據量分布不均勻,第4組數據量達 500+ 條,但第 0、1、2 組僅90+ 條。

7. 參考資料

[1] 電子商務顧客評論的熱點話題分析,蔡越 (廈門大學經濟學院統計系),郭鵬(廈門數析信息科技有限公司),方匡南(廈門大學經濟學院統計系,廈門大學數據挖掘研究中心),http://cos.name/2016/05/e-commerce-customer-reviews-hot-topic-analysis/?utm_source=tuicool&utm_medium=referral

[2] 基於k-means和tfidf的文本聚類代碼簡單實現,CSDN博客,http://blog.csdn.net/eastmount/article/details/50473675

[3] BlueMC新一代營銷工作平台,http://www.bluemc.cn/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM