楼主: casey_c
2657 1

[程序分享] 深度学习:基于 Gensim 的 Yelp 评论文本分类实例 [推广有奖]

  • 0关注
  • 10粉丝

博士生

92%

还不是VIP/贵宾

-

威望
0
论坛币
96 个
通用积分
2.1003
学术水平
2 点
热心指数
15 点
信用等级
2 点
经验
11502 点
帖子
278
精华
0
在线时间
94 小时
注册时间
2016-11-22
最后登录
2022-5-2

楼主
casey_c 发表于 2017-2-17 10:40:01 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
通过 gensim 将词向量(Word2Vec)学习机运用于文本分类中,参考文献:Document Classification by Inversion of Distributed Language Representations(ACL 2015)。
1、数据准备

首先,我们需要到 kaggle 上的 Yelp recruiting contest 下载我们要用到的数据,可能需要注册并登陆自己的 kaggle 账号。

https://www.kaggle.com/c/yelp-recruiting/download/yelp_training_set.zip
https://www.kaggle.com/c/yelp-recruiting/download/yelp_test_set.zip

接着,解压数据,并从中获取本文需要的有关信息。

在本次分析中,我们将使用一个非常简单的语法解析规则,如下所示:



  1. import re
  2. contractions = re.compile(r"'|-|\"")
  3. # 所有非字符数值
  4. symbols = re.compile(r'(\W+)', re.U)
  5. # 删除单个字符
  6. singles = re.compile(r'(\s\S\s)', re.I|re.U)
  7. # 分隔符(任何空格)
  8. seps = re.compile(r'\s+')

  9. # 文本清洗(注意操作顺序)
  10. def clean(text):
  11.     text = text.lower()
  12.     text = contractions.sub('', text)
  13.     text = symbols.sub(r' \1 ', text)
  14.     text = singles.sub(' ', text)
  15.     text = seps.sub(' ', text)
  16.     return text

  17. # 定义分句函数
  18. alteos = re.compile(r'([!\?])')
  19. def sentences(l):
  20.     l = alteos.sub(r' \1 .', l).rstrip("(\.)*\n")
  21.     return l.split(".")
复制代码
然后我们需要将上述规则嵌入一个能够产生带星级评论的评论生成器。
  1. from zipfile import ZipFile
  2. import json

  3. def YelpReviews(label):
  4.     with ZipFile("yelp_%s_set.zip"%label, 'r') as zf:
  5.         with zf.open("yelp_%s_set/yelp_%s_set_review.json"%(label,label)) as f:
  6.             for line in f:
  7.                 rev = json.loads(line)
  8.                 yield {'y':rev['stars'],\
  9.                        'x':[clean(s).split() for s in sentences(rev['text'])]}
复制代码
例如:
  1. YelpReviews("test").next()
复制代码
1.jpg


由于文件相对较小,我们可以将其中的所有内容都写入内存列表之中,这将花费一些时间。


  1. revtrain = list(YelpReviews("training"))
  2. print len(revtrain), "training reviews"

  3. ## 打乱数据排列顺序
  4. import numpy as np
  5. np.random.shuffle(revtrain)
复制代码
229907 training reviews
最后,我们还需再写一个函数,以便于我们按语料库顺序找到那些拥有确定星级的评论,并获取其中的每一个句子。
  1. def StarSentences(reviews, stars=[1,2,3,4,5]):
  2.     for r in reviews:
  3.         if r['y'] in stars:
  4.             for s in r['x']:
  5.                 yield s
复制代码
2、词向量(Word2Vec)模型构建
首先,我们需要安装一个现成的 Word2Vec 包。
  1. from gensim.models import Word2Vec
  2. import multiprocessing

  3. ## 构建一个 w2v 学习机
  4. basemodel = Word2Vec(
  5.     workers=multiprocessing.cpu_count(), # 获得你当前的 CPU 的核数
  6.     iter=3) # 该项参数的值越大,模型效果越好,构建时消耗的资源也越多
  7. print basemodel
复制代码
Word2Vec(vocab=0, size=100, alpha=0.025)
通过句子构建词库(我们也可以运用一个外生的无标注词库来对基础模型进行预训练)
  1. basemodel.build_vocab(StarSentences(revtrain))  
复制代码
接着,我们对每个基础的模型进行一次 深层复制(deep copy) ,以此来进行评论星级分类的训练。这一步的计算量比较大……
  1. from copy import deepcopy
  2. starmodels = [deepcopy(basemodel) for i in range(5)]
  3. for i in range(5):
  4.     slist = list(StarSentences(revtrain, [i+1]))
  5.     print i+1, "stars (", len(slist), ")"
  6.     starmodels[i].train(  slist, total_examples=len(slist) )
复制代码
2.jpg
以上内容转自 数析学院,原文还包括模型反演以及测试集案例,有需要的同学可以直接查看原文




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:参考文献 学习机 信息 账号

沙发
casey_c 发表于 2017-2-20 11:16:44

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 11:21