贴吧评论敏感词识别及情感分析初级实现之评论获取

贴吧评论敏感词识别及情感分析初级实现之评论获取

分三个模块实现贴吧评论敏感词识别及情感分析研究:“评论爬虫抓取”、“评论敏感词识别”、“评论情感分析(积极或消极)”。数据存储于MongoDB中,现设数据库“spiders”,数据集合users。其余两个模块见本人博文
在贴吧评论敏感词识别及情感分析初级实现里,只涉及最基础的知识,未进行代码的升级以及相应模块的技术完善。

评论爬虫抓取

数据获取实现

因受限于语料库(“网上购酒体验评论”),现只爬取与语料库相关内容的帖子,如https://tieba.baidu.com/p/6105007639。该模块旨在通过贴吧URL,爬虫抓取全部页面中网民的头像、网名、发表言论以及发表时间。该模块通过分析网页URL,采用递进方式对贴吧特定主题“网上商城购酒体验”(https://tieba.baidu.com/p/6105007639)进行抓取,如:
网页1:https://tieba.baidu.com/p/6105007639?pn=1,
网页2:https://tieba.baidu.com/p/6105007639?pn=2,
网页n:https://tieba.baidu.com/p/6105007639?pn=n
因此首先获取主题总页数,然后构建该主题下存在的所有网页URL 并对其进行数据抓取。
评论爬虫抓取的数据流图如下所示:
HTML初级爬取
抓取的数据只存储于users集合中,且users集合的组成为:users(username,image,page,time)。
(1)利用网页节点属性获取帖子中的总页数。

    from pyquery import PyQuery as pq
    #获取总页数
    def gettotalpage(url):
        url=url+str(1)
        doc=pq(url=url)
        temp = []
        for item in doc('.l_reply_num .red').items():
            temp.append(item.text())
        return(int(temp[1]))

(2)请求路径获得网页源码。

import requests
def get_one_page(url):
    try:
        headers={
        'User_Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
                     '(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
        }
        response=requests.get(url,headers=headers)
        if response.status_code==200:
            return response.text
        return None
    except RequestException:
        return None

(3)利用正则表达式,提取信息

import re
def parse_one_page(html):
    pattern=re.compile('<img\susername.*?src=.*?https('
                       '.*?)"/>.*?<li\sclass="d_name".*?<a'
                       '.*?target="_blank">(.*?)</a>.*?'
                       '<div.*?class="d_post_content'
                       '\sj_d_post_content.*?">(.*?)</div>.*?'
                       '<div\sclass="post-tail-wrap".*?<span'
                       '\sclass="tail-info'
                       '">.*?楼</span>.*?<span\sclass'
                       '="tail-info">(.*?)''</span>.*?</div>',
                       re.S)
    items=re.findall(pattern,html)
    for item in items:
        temp1 = re.sub('<.*>', '', item[1].strip())
        temp2 = re.sub('<.*>', '', item[2].strip())
        yield {
            'username':temp1,
            'img':str('https')+item[0],
            'page':temp2,
            'time':item[3]
        }

(4)将信息存储于users数据集合中。

from pymongo import MongoClient
'''连接mongodb中的spiders库中的users集合'''
client=MongoClient()
db=client['spiders']
collection1=db['users']
def save_to_mongo(result):
    #此时result为字典集
    if collection1.insert_many(result):
        print('save successful')

(5)根据总页数,爬取该帖子所有网页的用户评论信息。

#抓取所有评论页面,规定不超过十页
def panduan(url,offset):
    url=url+str(offset)
    if requests.get(url).status_code==200:
        html = get_one_page(url)
        save_to_mongo(parse_one_page(html))
        #for item in parse_one_page(html):
            #write_to_file(item)
#抓取所有信息
def total_scrapy(url):
    url=url+str('?pn=')
    for i in range(1,gettotalpage(url=url)+1):
        panduan(url,i)

爬虫抓取缺陷

(1)帖子中的回复评论数据属于Ajax异步加载,没有实现Ajax分析爬取,因此数据不能获取。
(2)不能进行分布式爬取,未使用框架(spiders、scrapy),所用为“三段式”。

参考来源

(1)崔庆才.python3网络爬虫开发实战[M].北京:人民邮电出版社,2018

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论敏感词屏蔽功能可以通过以下步骤实现: 1. 在 MySQL 数据库中创建一个敏感词表,用于存储所有需要屏蔽的敏感词。 2. 在 Spring Boot 中使用 MyBatis 或 JPA 等框架,将敏感词表映射为一个实体类,并创建一个 DAO 层用于操作该表。 3. 在后端编写一个过滤器,用于过滤评论中的敏感词。过滤器可以在评论提交到后端之前进行拦截,并根据敏感词表进行屏蔽。 4. 在前端使用 Vue3,通过 AJAX 请求将评论提交到后端,并接收后端返回的结果。如果评论中包含敏感词,前端可以弹出提示框进行提醒。 下面是一个简单的示例代码,仅供参考: MySQL敏感词表: ```sql CREATE TABLE `sensitive_words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` Spring Boot 实体类: ```java @Entity @Table(name = "sensitive_words") public class SensitiveWord { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "word") private String word; // getter 和 setter 方法 } ``` Spring Boot DAO 层: ```java @Repository public interface SensitiveWordDao extends JpaRepository<SensitiveWord, Integer> { List<SensitiveWord> findAll(); } ``` Spring Boot 过滤器: ```java @WebFilter(filterName = "sensitiveWordFilter", urlPatterns = "/comment/*") public class SensitiveWordFilter implements Filter { private List<String> sensitiveWords = new ArrayList<>(); @Autowired private SensitiveWordDao sensitiveWordDao; @Override public void init(FilterConfig filterConfig) throws ServletException { List<SensitiveWord> words = sensitiveWordDao.findAll(); for (SensitiveWord word : words) { sensitiveWords.add(word.getWord()); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String comment = httpRequest.getParameter("comment"); for (String word : sensitiveWords) { if (comment.contains(word)) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setStatus(400); httpResponse.getWriter().write("评论中包含敏感词"); return; } } chain.doFilter(request, response); } @Override public void destroy() { } } ``` Vue3 组件: ```vue <template> <div> <textarea v-model="comment"></textarea> <button @click="submitComment">提交</button> </div> </template> <script> import axios from 'axios'; export default { data() { return { comment: '' } }, methods: { submitComment() { axios.post('/comment', { comment: this.comment }).then(response => { alert('评论成功'); }).catch(error => { alert(error.response.data); }); } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值