根據以前我寫的 爬取及分析天貓商城岡本評論(一)數據獲取 方法,爬取了岡本旗艦店的全部避孕套產品的公開評論,共計30824條。html
此次對這3萬多條評論去作數據分析前的預處理。python
對於蒐集到的評論數據,主要是針對三個字段去進行分析,就是「產品類型product_type」,「首次評論first_comment」,「評論日期comment_date」。因此數據的預處理主要針對這3個字段去進行。mysql
產品類型主要有兩個問題:一是文本過長,二是有缺失值。sql
這個字段的缺失值有2997條。數據庫
產品類型這個字段很是關鍵,沒辦法採用替代等方式去處理這些缺失值。暫時將這些缺失值的sort字段更新爲-1,並在產品類型裏面填入「unknown」。post
UPDATE sp_okamoto_comment SET product_type='unknow',sort=-1 WHERE product_type='';
效果:fetch
思路:分一個附表,用於記錄具體的產品類型包含的產品。而後在主表中用附表的編碼代替。編碼
建立一個產品類型表:spa
CREATE TABLE `okamoto_product_type` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID自增', `product_type` varchar(100) DEFAULT NULL COMMENT '產品類型', `sort` int(11) NOT NULL COMMENT '序號', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間', PRIMARY KEY (`id`), KEY `ky_sp_okamoto_comment_sort` (`sort`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='岡本產品類型表';
將產品類型插入表中:3d
INSERT INTO `okamoto_product_type`(`product_type`,sort) SELECT DISTINCT(product_type),1 FROM sp_okamoto_comment;
文本處理:刪去沒用的產品信息
UPDATE `okamoto_product_type` SET `product_type` = REPLACE(`product_type`, '顏色分類:', ''); UPDATE `okamoto_product_type` SET `product_type` = REPLACE(`product_type`, ';避孕套規格:其它規格;顏色:其它顏色 ', '');
產品類別表的效果圖:
將主表的product_type也修改一下,並將它改成product_id
UPDATE sp_okamoto_comment s INNER JOIN okamoto_product_type o ON o.product_type=s.product_id SET s.product_id=o.id;
通過處理之後,一共有606個產品類別。由於有不少類別的銷量不多,評論的樣品量太少,因此暫定用銷量在300以上的數據做爲統計。這個是後話了。
SELECT COUNT(product_id) amount, product_id FROM sp_okamoto_comment GROUP BY product_id HAVING COUNT(product_id)>300 ORDER BY amount
評論的內容主要是:1,沒有評論的,系統顯示爲:此用戶沒有填寫評論!;2,無用評論,純粹是湊字數的。第一類能夠經過判斷,在情感分析時跳開無論。第二類比較難經過文本判斷,目前先不處理。
UPDATE sp_okamoto_comment SET `status`=-2 WHERE first_comment="此用戶沒有填寫評論!";
受影響的行: 1223
時間: 0.066s
經過pymysql對數據庫內的評論進行讀取,而後利用snowNLP進行情感分析,最後將分析出的結果,寫入sentiment_point字段。
import pymysql from snownlp import SnowNLP def sql_snownlp(count_num): db = pymysql.connect(host="localhost",user="root",password="",db="python_data_sql",charset='utf8') cursor = db.cursor() for id_num in range(1,count_num): try: sql_select = "SELECT first_comment FROM sp_okamoto_comment WHERE id={id_num};".format_map(vars()) # 執行sql語句 cursor.execute(sql_select) res = cursor.fetchone() res = str(res).replace('(\'','').replace('\',)','')#查詢出來的結果是一個帶逗號的元組,例如('一直在這買的',),因此文本處理一下 s=SnowNLP(res) point=s.sentiments#情感分析,分數爲0到1,1是最高分情感,0是最負面情感 sql_update = "UPDATE sp_okamoto_comment SET sentiment_point={point} WHERE id={id_num};".format_map(vars()) cursor.execute(sql_update) db.commit() except: print('第{id_num}條update失敗'.format_map(vars())) # 發生錯誤時回滾 db.rollback() # 關閉數據庫鏈接 db.close()
效果圖:
由於我在數據庫裏面設置了保留4位小數,因此會出現0的狀況。再者就是snowNLP的準確率大概有8到9成,算是比較高的了,雖然有時候評分不許確。
對於評論的日期,通常不須要進行什麼處理,爬下來的數據已經比較標準化了。
數據處理的目的主要是將數據進行清洗,而後作標準化。對於評論的清洗,仍是不太夠。很對湊字數的評論暫時沒有辦法去處理它。再者就是snowNLP的情感分析,準確率沒有辦法達到100%。
但整體來講,數據處理的目的大體上仍是達到了。下一步,咱們就要對處理後的數據,進行分析,可視化,最後解讀生成數據分析報告。