爬取美團(tuán)評(píng)論—情感分析模型建立

????隨著大數(shù)據(jù)時(shí)代的到來(lái)瞳步,如何篩選以及獲取有效信息成為了一項(xiàng)重要的技能劣坊,通過(guò)使用爬蟲(chóng)按照一種規(guī)則自動(dòng)從萬(wàn)維網(wǎng)篩選信息已經(jīng)成為一種重要的能力测蘑,本次實(shí)驗(yàn)的目的就是通過(guò)工程實(shí)踐加深對(duì)理論知識(shí)的深入理解和綜合應(yīng)用,進(jìn)一步提高實(shí)踐動(dòng)手能力。
????(1)首先對(duì)python環(huán)境的安裝以及美團(tuán)商家信息的爬取,所爬取的商家信息為商家的id、商家名、平均得分梨熙、地址、平均價(jià)格、獲得評(píng)論總數(shù)怎憋,得到的結(jié)果保存在csv文件之中铸鹰,然后通過(guò)得到的商家的id構(gòu)造出可以獲取用戶(hù)評(píng)論的url,通過(guò)訪問(wèn)這個(gè)url,獲取這個(gè)商家的評(píng)論以及打分墅拭,存入到csv文件之中镀钓。
????(2)其次對(duì)第一個(gè)實(shí)驗(yàn)爬取到的評(píng)論數(shù)據(jù)按照評(píng)分進(jìn)行評(píng)論分類(lèi)探遵,得分大于30的為好評(píng)類(lèi),小于30的為差評(píng)類(lèi),我們?cè)诿缊F(tuán)上面爬取得到的評(píng)論和打分粟誓,最高為50分揽咕,將所有數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集,使用多種模型來(lái)進(jìn)行一個(gè)簡(jiǎn)單的中文情感分類(lèi),最后用測(cè)試集來(lái)檢測(cè)我們模型的泛化能力。
????(3)最后對(duì)每個(gè)商家的評(píng)論建立詞云,將多的詞展示出來(lái)。
對(duì)所需要操作進(jìn)行分析主要步驟可以分成兩個(gè)階段:
  • 美團(tuán)評(píng)論數(shù)據(jù)的爬取
  • 建立模型進(jìn)行分析
主要實(shí)驗(yàn)環(huán)境凭戴、配置、需要學(xué)習(xí)到的知識(shí):

(1)python2.7
(2)Bert中文預(yù)向量處理支持钞它、Jupyter
(3)php操灿、json相關(guān)知識(shí),所運(yùn)用到的一些包:requests救鲤、numpy入问、re棱烂、csv、pandas馁启、keras霉颠、json、urllib苍糠、os瞳筏、wordSegment钻心、word_cloud痒给、PIL棺棵、matplotlib

一缚柏、爬取美團(tuán)商家信息和評(píng)論數(shù)據(jù)
1.具體思路:

首先疙挺,確定爬取美團(tuán)—武漢美食的網(wǎng)站地址;
然后通過(guò)json得到請(qǐng)求的頁(yè)面信息,期間設(shè)置headers來(lái)進(jìn)行偽造請(qǐng)求术唬,避免被美團(tuán)頁(yè)面攔截驗(yàn)證粗仓;
再者,就是通過(guò)正則匹配找到要求我們?cè)陧?yè)面中爬取的內(nèi)容设捐;
最后借浊,遍歷各個(gè)頁(yè)面將需要信息爬取下來(lái)輸出保存在csv文檔之中扔仓。
在爬取評(píng)論內(nèi)容些己,得到每個(gè)商家評(píng)論和評(píng)分所在的json渤愁,我們通過(guò)正則表達(dá)式爬取需要的內(nèi)容然后存入csv文件中医寿,每個(gè)商家的評(píng)論和評(píng)分存在一個(gè)csv文件中,以該商家的poiId作為文件的名字羹令。

上述思路流程圖:


總體思路流程.png
2.美團(tuán)商鋪爬取
爬取商品.png

????在商鋪爬取中闷尿,首先構(gòu)造武漢美團(tuán)的網(wǎng)站父虑,通過(guò)設(shè)置循環(huán)訪問(wèn)的頁(yè)數(shù)使用python進(jìn)行訪問(wèn):

for i in range(1,8):
      url = 'https://wh.meituan.com/meishi/pn' + str(i) + '/'
      headers = {
      'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11' }

????在上述構(gòu)造訪問(wèn)美團(tuán)的url過(guò)程中母赵,我們需要設(shè)置header才能避免訪問(wèn)失敗逸爵,通過(guò)一個(gè)循環(huán)來(lái)對(duì)美團(tuán)的頁(yè)面進(jìn)行訪問(wèn),我們也可以設(shè)置多個(gè)頁(yè)數(shù)凹嘲,這里對(duì)商鋪的設(shè)置是爬取8頁(yè)信息,我當(dāng)時(shí)爬取的時(shí)候每頁(yè)有15家商鋪的信息构韵,8*15 = 120 家商鋪信息周蹭。

????當(dāng)get_info函數(shù)得到main函數(shù)傳給的wurl和headers的信息之后趋艘,通過(guò)python的requests.get得到url的信息然后存到一個(gè)response里面,通過(guò)python的正則來(lái)獲取response.text里面我們需要的關(guān)鍵點(diǎn)凶朗。

response = requests.get(url,headers = headers)              # 獲取信息
poiId = re.findall(r'"poiId":(\d+),',response.text                # 商家id 
shopname = re.findall(r'"frontImg".*?title":(.*?)',response.text)    # 商家名字
avgScore = re.findall(r'"avgScore":(.*?),'response.text)            # 平均分
allCommentNum = re.findall(r'"allCommentNum":(\d+)',response.text)   # 評(píng)論總數(shù)
address = re.findall(r'"address":(.*?),'response.text)                 # 商家地址
avgPrice = re.findall(r'"avgPrice":(\d+),'response.text)               # 平均價(jià)格

????這里第一行代碼的目的是通過(guò)url瓷胧、headers對(duì)目標(biāo)構(gòu)造訪問(wèn)請(qǐng)求,接下來(lái)的代碼為通過(guò)正則表達(dá)式—findall對(duì)特征的內(nèi)容進(jìn)行爬取棚愤,從而得到需要的相應(yīng)信息搓萧,存到對(duì)應(yīng)的變量之中,這里的poiId宛畦、shopname瘸洛、avgScore、allCommentNum次和、address反肋、avgPrice都是list格式,里面有15個(gè)數(shù)據(jù)內(nèi)容踏施,因?yàn)榕廊∫豁?yè)美團(tuán)商家的頁(yè)面有15家商家石蔗,這在上面已經(jīng)提及,然后通過(guò)append函數(shù)添加到一個(gè)總的list之中畅形,構(gòu)成一行數(shù)據(jù)养距,然后返回包含15個(gè)商家信息數(shù)據(jù)的list。

????最后調(diào)用write_to_file函數(shù)將商家信息存到csv文件之中日熬,循環(huán)進(jìn)行8次铃在,以此爬取8個(gè)武漢美團(tuán)美食的商家頁(yè)面,總共105家商家信息碍遍。


商鋪信息.png
3.商鋪評(píng)論爬取
爬取評(píng)論.png

????基于我們對(duì)商鋪的爬取獲得的poiId定铜,從第一個(gè)得到的csv文件之中獲取,這里通過(guò)使用python對(duì)于csv的操作函數(shù)就能夠?qū)崿F(xiàn)怕敬,簡(jiǎn)單的操作直接略過(guò)揣炕,得到poiId用來(lái)構(gòu)造訪問(wèn)評(píng)論信息所在的url。

def get_originUrl(self):
    """
       構(gòu)造訪問(wèn)店鋪的url拼接东跪,這里返回的每個(gè)特定商家的網(wǎng)頁(yè)的開(kāi)頭部分畸陡,返回到調(diào)用該函數(shù)的地方,便于得到需要爬取該商家的url
    """
    return parse.quote_plus('http://www.meituan.com/meishi/' + self.shop_id + '/')

然后通過(guò)對(duì)以下參數(shù)來(lái)確定得到評(píng)論和評(píng)分?jǐn)?shù)據(jù)所在的url地方

params = {
            'platform': '1',
            'partner': '126',
            'originUrl': url_code,
            'riskLevel': '1',
            'optimusCode': '1',
            'id': self.shop_id,     # 我們?cè)O(shè)置的內(nèi)部poiId
            'offset': '0',
            'pageSize': '200',     # 根據(jù)捕獲異常獲得評(píng)論數(shù)較多的量虽填,評(píng)論少就不要了
            'sortType': '1',
        }
 headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11' }

response = requests.get(url=url, params=params, headers=headers)
data = response.text

同樣是構(gòu)造一個(gè)header丁恭,通過(guò)requests.get帶有特定的參數(shù)訪問(wèn)url得到信息存入到data之中,data是一個(gè)str類(lèi)型的數(shù)據(jù)斋日。

data_dict = json.loads(data)
for item in data_dict.get('data').get('comments'):
        with open(r'CommentData/{}.csv'.format(str(self.shop_id)), 'a', encoding='utf-8') as csvfile:
        job_list = [item.get('comment'),item.get('star')]
        write = csv.writer(csvfile)
        write.writerow(job_list)
except TypeError:
    pass

上面設(shè)置了一個(gè)捕獲異常的處理牲览,主要是因?yàn)樵谂廊≡u(píng)論的時(shí)候,一些評(píng)論為空或者其他類(lèi)型的錯(cuò)誤導(dǎo)的出錯(cuò)恶守,這里我們就pass掉第献,直接進(jìn)行下一條的爬取贡必。


評(píng)論內(nèi)容2.png

二、建立模型對(duì)評(píng)論數(shù)據(jù)進(jìn)行分析

????一般思路是運(yùn)用樸素貝葉斯算法進(jìn)行文本分類(lèi)庸毫,分析實(shí)驗(yàn)說(shuō)明書(shū)提供給我網(wǎng)頁(yè)仔拟,成功實(shí)現(xiàn)使用樸素貝葉斯算法的文本分類(lèi),主要思路為對(duì)數(shù)據(jù)進(jìn)行處理飒赃,然后讀取利花,處理缺失的評(píng)論,然后重置索引载佳,對(duì)評(píng)論的特征進(jìn)行處理炒事,根據(jù)評(píng)分進(jìn)行分類(lèi),設(shè)置特征標(biāo)簽數(shù)組刚盈,分別為好的為1羡洛,壞的為0,然后引入樸素貝葉斯算法訓(xùn)練藕漱,通過(guò)jieba分詞將評(píng)論變?yōu)槎嘣~組并進(jìn)行向量化欲侮,然后加入一些停用詞處理,剔除一些分析之中的干擾詞肋联,然后實(shí)例化一個(gè)模型威蕉,通過(guò)管道把特征詞放進(jìn)行訓(xùn)練,通過(guò)交叉驗(yàn)證以及對(duì)測(cè)試集進(jìn)行測(cè)試橄仍,當(dāng)然韧涨,訓(xùn)練集測(cè)試集都打亂,最后得到精確度為0.84002000000000006侮繁,也就是84%左右虑粥,我當(dāng)然不滿意這個(gè)實(shí)驗(yàn)結(jié)果。

????然后通過(guò)查詢(xún)資料宪哩,了解到Bert娩贷,決定想用Bert進(jìn)行實(shí)驗(yàn),查閱到的資料顯示Bert來(lái)做各種實(shí)驗(yàn)都是結(jié)果挺高的锁孟,于是打算使用bert來(lái)進(jìn)行彬祖,下面的思路主要就是面對(duì)Bert來(lái)寫(xiě)的,因?yàn)闃闼刎惾~斯方法我在上面也進(jìn)行了大致的描述品抽,也得到了結(jié)果储笑。

情感模型建立.png
Bert中文向量分析思路描述:

????其實(shí),不管你用什么模型或者方法去進(jìn)行簡(jiǎn)單情感分類(lèi)的訓(xùn)練圆恤,他的大致流程其實(shí)和我在上面進(jìn)行的樸素貝葉斯方法差不多突倍,大致內(nèi)容都是數(shù)據(jù)預(yù)處理、標(biāo)識(shí)組設(shè)置—>評(píng)論數(shù)據(jù)打亂—>評(píng)論數(shù)據(jù)向量化—>輸入到模型之中—>訓(xùn)練—>驗(yàn)證—>得到結(jié)果這一個(gè)流程展開(kāi)的,使用Bert進(jìn)行分析也是這個(gè)流程赘方,只是很多細(xì)節(jié)不一樣罷了烧颖。


????在這里能夠使用Bert主要是感謝騰訊AI實(shí)驗(yàn)室所發(fā)布的bert-as-service接口弱左,通過(guò)這個(gè)接口窄陡,得到預(yù)訓(xùn)練好的bert模型生成的句向量詞向量,不需要引入一些特征詞拆火,而是通過(guò)評(píng)論數(shù)據(jù)轉(zhuǎn)換得到的句向量經(jīng)過(guò)訓(xùn)練得到兩個(gè)好跳夭、壞模型然后進(jìn)行驗(yàn)證。但是主要的缺點(diǎn)就是跑得挺慢的们镜,我這里10000多條訓(xùn)練數(shù)據(jù)和1000多條驗(yàn)證數(shù)據(jù)在電腦上跑了大概20多分鐘币叹,還是功率全開(kāi)的那種,聲音特別響模狭、散熱一直在運(yùn)作颈抚,所以基本上我總共跑了2個(gè)樸素貝葉斯的模型,還有3個(gè)Bert的模型嚼鹉。


主要實(shí)現(xiàn)操作:
  • 導(dǎo)入數(shù)據(jù)
  • 對(duì)評(píng)論進(jìn)行過(guò)濾贩汉,只保留中文
  • 構(gòu)建評(píng)論數(shù)據(jù)集合——訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)
  • 創(chuàng)建評(píng)論數(shù)據(jù)好壞匹配標(biāo)簽組
  • 隨機(jī)打亂評(píng)論
  • 通過(guò)Bert-as-service得到數(shù)據(jù)中文詞向量
  • 建立美團(tuán)評(píng)論情感分析模型
  • 開(kāi)始訓(xùn)練
  • 查看訓(xùn)練情況并將其可視化顯示
  • 測(cè)試集進(jìn)行測(cè)試并得到模型驗(yàn)證結(jié)果
1.導(dǎo)入數(shù)據(jù)
good = pd.read_csv('N_good.csv')   # 導(dǎo)入不同評(píng)論信息
bad = pd.read_csv('N_bad.csv')
comments_10 = good.comment
comments_20 = bad.comment

這里我就不贅述關(guān)于使用python對(duì)csv文件進(jìn)行數(shù)據(jù)處理的過(guò)程了,只需要知道使用python將爬取到的商家評(píng)論全都整合到一個(gè)csv文件之中锚赤,根據(jù)實(shí)驗(yàn)說(shuō)明書(shū)中匹舞,將評(píng)論評(píng)分大于30的視之為好評(píng)整合在N_good.csv文件之中,小于30的評(píng)論評(píng)分整合到N_bad.csv之中线脚,然后通過(guò)pandas庫(kù)導(dǎo)入赐稽。

2.對(duì)評(píng)論進(jìn)行過(guò)濾,只保留中文
for i in range(len(comments_10)):    # 對(duì)好的評(píng)論進(jìn)行過(guò)濾
     goodcom = comments_10.iloc[i]
     try:
        goodcom = re.sub("[^\u4E00-\u9FA5]","",goodcom)
        if len(goodcom) > 2 and len(goodcom) < 100:
            X_data1.append(goodcom)
     except:
        pass
 for j in range(len(comments_20)):    # 對(duì)壞的評(píng)論進(jìn)行過(guò)濾
     badcom = comments_20.iloc[j]
     try:
        badcom = re.sub("[^\u4E00-\u9FA5]","",badcom)
        if len(badcom) > 2 and len(badcom) < 100:
            X_data2.append(badcom)
     except:
        pass

在這個(gè)階段浑侥,我們通過(guò)for循環(huán)姊舵,把每一行中的評(píng)論導(dǎo)入,使用正則表達(dá)式來(lái)過(guò)濾評(píng)論中的非中文字符寓落,s"[^\u4E00-\u9FA5]"這里表示的是匹配中文字符的正則表達(dá)式括丁,然后放入到goodcom之中,最后我們篩選出字符長(zhǎng)度大于2且小于100的評(píng)論加入到好評(píng)集合之中,壞評(píng)集過(guò)程和好評(píng)一樣零如。

3.構(gòu)建評(píng)論數(shù)據(jù)集合——訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)
X_data = X_data1[:7000] + X_data2[:7000]
X_test_data = X_data1[7000:7900] + X_data2[7000:7900]

下面X_data是選出X_data1之后好的評(píng)論的前6000條和X_data2之后的壞的評(píng)論的7000條來(lái)組成訓(xùn)練躏将,X_test_data為測(cè)試集,選出X_data1和X_data2之中的各900條考蕾。

4.創(chuàng)建評(píng)論數(shù)據(jù)好壞匹配標(biāo)簽組
y_data = [1 for i in range(7000)] + [0 for i in range(7000)]
y_data = np.asarray(y_data, dtype=np.float32)
y_test_data = [1 for i in range(900)] + [0 for i in range(900)]
y_test_data = np.asarray(y_test_data, dtype=np.float32)

這里主要就是在得到訓(xùn)練數(shù)據(jù)之后祸憋,我們手工創(chuàng)建一個(gè)labels數(shù)組來(lái)作為訓(xùn)練標(biāo)簽,前7000個(gè)是好的評(píng)論我們?cè)O(shè)置為1肖卧,后7000個(gè)為壞的評(píng)論我們?cè)O(shè)置為0蚯窥,測(cè)試集同樣如此。

5.隨機(jī)打亂評(píng)論
nums = []
nums_ = []
X_train = []
Y_train = []
X_test = []
Y_test = []
nums = np.arange(14000)
np.random.shuffle(nums)
for i in nums:
    X_train.append(X_data[i])
    Y_train.append(y_data[i])
nums_ = np.arange(1800)
np.random.shuffle(nums_)
for i in nums_:
    X_test.append(X_test_data[i])
    Y_test.append(y_test_data[i])

借助numpy來(lái)對(duì)數(shù)據(jù)進(jìn)行隨機(jī)打亂,標(biāo)簽數(shù)組同樣與訓(xùn)練集拦赠、測(cè)試集應(yīng)著巍沙,用shuffle來(lái)隨機(jī)打亂訓(xùn)練集和測(cè)試集,標(biāo)簽數(shù)組對(duì)應(yīng)荷鼠,然后list轉(zhuǎn)換為numpy數(shù)組句携,后面模型輸入的需要是numpy的數(shù)據(jù)類(lèi)型。

6.通過(guò)Bert-as-service得到數(shù)據(jù)中文詞向量
bc = BertClient(ip = 'localhost')
input_train = bc.encode(X_train)
input_test = bc.encode(X_test)

這里是重點(diǎn)允乐,這行代碼將訓(xùn)練集測(cè)試集進(jìn)行向量化矮嫉,每一行評(píng)論數(shù)據(jù)轉(zhuǎn)換為1768維的句向量*,通過(guò)在終端開(kāi)啟一個(gè)端口牍疏,并設(shè)置相應(yīng)線程來(lái)對(duì)輸入的評(píng)論數(shù)據(jù)進(jìn)行向量化轉(zhuǎn)換蠢笋,具體操作過(guò)程如下所示:

屏幕快照 2019-10-10 上午9.49.21.png

這里通過(guò)導(dǎo)入bert的中文預(yù)向量轉(zhuǎn)換模型的地址,然后設(shè)置工作的可以說(shuō)是線程數(shù)鳞陨,我這里設(shè)置的是4個(gè)線程昨寞。
中文預(yù)向量轉(zhuǎn)換模型在這里下載。

具體說(shuō)明如下所示:


bert1.png
bert2.png

這里厦滤,箭頭指的是下載的中文的Bert訓(xùn)練文件的位置援岩、進(jìn)行評(píng)論轉(zhuǎn)換的工作的線程數(shù)量,開(kāi)放的轉(zhuǎn)換的本地端口號(hào)馁害。下面為進(jìn)行訓(xùn)練的過(guò)程:

bert3.png
bert4.png
7.建立美團(tuán)評(píng)論情感分析模型
model = Sequential()
model.add(Dense(32, activation = 'relu', input_shape=(768,)))
model.add(Dropout(0.5))
model.add(Dense(32, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
    model.compile(
      loss = 'binary_crossentropy',
       optimizer = tf.train.AdamOptimizer(),
        metrics = ['accuracy']
    )

這里運(yùn)用了Keras來(lái)進(jìn)行建模窄俏,用的是Sequential類(lèi)來(lái)定義這個(gè)模型,然后模型使用Dense來(lái)進(jìn)行全連接層拼接碘菜,引入Dropout層來(lái)進(jìn)行部分?jǐn)?shù)據(jù)丟棄防止過(guò)擬合凹蜈,然后指定這個(gè)模型的優(yōu)化器損失函數(shù),以及監(jiān)控的數(shù)據(jù)忍啸。

8.開(kāi)始訓(xùn)練
start = model.fit(
        input_train, Y_train,
        epochs = 30,
        batch_size = 256,
        validation_split = 0.2,
        verbose = 1
)

這里迭代訓(xùn)練30個(gè)仰坦,使用訓(xùn)練集的20%來(lái)作為驗(yàn)證集,通過(guò)fit的方式將這些numpy形式的數(shù)組傳入到模型之中计雌,開(kāi)始訓(xùn)練:

訓(xùn)練開(kāi)始.png
9.查看訓(xùn)練情況并將其可視化顯示
# 將數(shù)據(jù)擬合和準(zhǔn)確率打印出來(lái)
import matplotlib.pyplot as plt
history_dict = history.history
epochs = range(1, len(history_dict['acc']) + 1)
plt.figure()
plt.plot(epochs, history_dict['acc'], 'b',label='acc')
plt.plot(epochs, history_dict['val_acc'], 'bo',label='val_acc')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
訓(xùn)練圖.png
plt.clf()
plt.figure()
plt.plot(epochs, history_dict['loss'], 'b', label='acc')
plt.plot(epochs, history_dict['val_loss'],'bo',label='val_acc')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
數(shù)據(jù)擬合2.png

上面兩個(gè)圖都在一定程度上顯示了我的訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù)擬合度是很高的悄晃,訓(xùn)練集是有效的。

回憶了一下凿滤,我這里在jupyter能夠順利運(yùn)行妈橄,在vscode搭建的操作平臺(tái)下卻是顯示失敗的,主要是python里面的繪圖函數(shù)庫(kù)有問(wèn)題翁脆,我的解決方案是去使用Qt來(lái)進(jìn)行繪制眷蚓,mac下對(duì)于python繪圖主要為tk。

10.測(cè)試集進(jìn)行測(cè)試并得到模型驗(yàn)證結(jié)果
test_loss = model.evaluate(
    input_test,Y_test,
    batch_size = 64,
    verbose = 1
)
print(test_loss)            # 輸出測(cè)試信息
測(cè)試集.png

使用Bert進(jìn)行情感分類(lèi)反番,經(jīng)過(guò)模型訓(xùn)練之后沙热,使用測(cè)試集進(jìn)行測(cè)試叉钥,可以得到該精度達(dá)到了92.8%,訓(xùn)練損失為0.20篙贸。

三投队、繪制詞云

具體思路:

jieba進(jìn)行分詞,還有python提供的wordcloud庫(kù)爵川。首先導(dǎo)入需要進(jìn)行分詞的文本敷鸦,然后用jieba將文本進(jìn)行分詞,返回分詞之后的結(jié)果雁芙,中文文本需要進(jìn)行分詞操作轧膘。然后就是設(shè)置顯示方式钞螟、生成詞云兔甘、將生成的詞云保存到本地,然后顯示出來(lái)鳞滨。

    d = path.dirname(__file__)
    tag = np.array(Image.open(path.join(d, "Images//head.jpg")))
    font_path = path.join(d,"font//msyh.ttf")
    stopwords = set(STOPWORDS)
    wc = WordCloud(background_color="white",        # 設(shè)置背景顏色
           max_words = 2000,                     # 詞云顯示的最大詞數(shù)  
           mask = tag,                           # 設(shè)置背景圖片       
           stopwords = stopwords,                  # 設(shè)置停用詞
           font_path=font_path,                    # 兼容中文字體洞焙,不然中文會(huì)顯示亂碼
       )

    # 生成詞云 
    wc.generate(text)

這里不想介紹了,突然發(fā)現(xiàn)寫(xiě)得挺多的拯啦,上面就是詞云構(gòu)建的關(guān)鍵代碼澡匪,通過(guò)設(shè)置各類(lèi)參數(shù)然后得到詞云,還可以引入不同的商家的信息進(jìn)行詞云建立褒链。

詞云.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唁情,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甫匹,更是在濱河造成了極大的恐慌甸鸟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵迅,死亡現(xiàn)場(chǎng)離奇詭異抢韭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)恍箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)刻恭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扯夭,你說(shuō)我怎么就攤上這事鳍贾。” “怎么了交洗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵骑科,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我藕筋,道長(zhǎng)纵散,這世上最難降的妖魔是什么梳码? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮伍掀,結(jié)果婚禮上掰茶,老公的妹妹穿的比我還像新娘。我一直安慰自己蜜笤,他們只是感情好濒蒋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著把兔,像睡著了一般沪伙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上县好,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天围橡,我揣著相機(jī)與錄音,去河邊找鬼缕贡。 笑死翁授,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晾咪。 我是一名探鬼主播收擦,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谍倦!你這毒婦竟也來(lái)了塞赂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤昼蛀,失蹤者是張志新(化名)和其女友劉穎宴猾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曹洽,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳍置,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了送淆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片税产。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖偷崩,靈堂內(nèi)的尸體忽然破棺而出辟拷,到底是詐尸還是另有隱情,我是刑警寧澤阐斜,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布衫冻,位于F島的核電站,受9級(jí)特大地震影響谒出,放射性物質(zhì)發(fā)生泄漏隅俘。R本人自食惡果不足惜邻奠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望为居。 院中可真熱鬧碌宴,春花似錦、人聲如沸蒙畴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膳凝。三九已至碑隆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹬音,已是汗流浹背上煤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟绊,地道東北人楼入。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牧抽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遥赚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容