对商品的评论进行数据挖掘得到评论标签(商品属性+评论观点),以及用户的分组信息

对商品的评论进行数据挖掘得到评论标签(商品属性+评论观点),以及用户的分组信息:

第一步:对文本进行预处理,分词并进行语义角色标注

# -*- coding:utf-8 -*-
import os
from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller
from gensim.models import Word2Vec
import pandas as pd
import numpy as np
import heapq
import re
import emojiclass Sentence_Parser:def __init__(self):#LTP_DIR = 'F:\project support\ltp_data_v3.4.0'LTP_DIR = './ltp_data_v3.4.0'# 分词self.segmentor = Segmentor()self.segmentor.load(os.path.join(LTP_DIR, 'cws.model'))# 词性标注self.postagger = Postagger()self.postagger.load(os.path.join(LTP_DIR, 'pos.model'))# 依存句法分析self.parser = Parser()self.parser.load(os.path.join(LTP_DIR, 'parser.model'))# 命名实体识别(人名、地名、机构名等)self.recognizer = NamedEntityRecognizer()self.recognizer.load(os.path.join(LTP_DIR, 'ner.model'))# 词义角色标注(施事、受事、时间、地点)self.labeller = SementicRoleLabeller()self.labeller.load(os.path.join(LTP_DIR, 'pisrl_win.model'))def format_labelrole(self, words, postags):"""词义角色标注"""arcs = self.parser.parse(words, postags)roles = self.labeller.label(words, postags, arcs)roles_dict = {}for role in roles:roles_dict[role.index] = {arg.name: [arg.name, arg.range.start, arg.range.end] for arg in role.arguments}# for item in roles_dict.items():#     print(item)return roles_dictdef bulid_parser_child_dict(self, words, postags, arcs):"""句法分析---为句子中的每个词语维护一个保存句法依存子节点的字典"""child_dict_list = []format_parse_list = []for index in range(len(words)):child_dict = dict()for arc_index in range(len(arcs)):if arcs[arc_index].head == index + 1:if arcs[arc_index].relation not in child_dict:child_dict[arcs[arc_index].relation] = []child_dict[arcs[arc_index].relation].append(arc_index)else:child_dict[arcs[arc_index].relation].append(arc_index)child_dict_list.append(child_dict)rely_id = [arc.head for arc in arcs]# print(rely_id)relation = [arc.relation for arc in arcs]# for i in range(len(relation)):#     print(words[i], '_', postags[i], '_', i, '_', relation[i])heads = ['Root' if id == 0 else words[id-1] for id in rely_id]# print(heads)for i in range(len(words)):a = [relation[i], words[i], i, postags[i], heads[i], rely_id[i]-1, postags[rely_id[i]-1]]format_parse_list.append(a)return child_dict_list, format_parse_listdef parser_main(self, sentence):"""parser主函数"""words = list(self.segmentor.segment(sentence))postags = list(self.postagger.postag(words))arcs = self.parser.parse(words, postags)child_dict_list, format_parse_list = self.bulid_parser_child_dict(words, postags, arcs)roles_dict = self.format_labelrole(words, postags)return words, postags, child_dict_list, roles_dict, format_parse_listdef select(self, words, postags):"""筛选出名词和形容词"""co_model = Word2Vec.load('coseg_text.model')n_list0 = []a_list = []for i in range(len(postags)):if postags[i] == 'n':if len(words[i]) >= 2:n_list0.append(words[i])if postags[i] == 'a':# if len(words[i]) >= 2:a_list.append(words[i])n_list0 = list(set(n_list0))a_list = list(set(a_list))# print(n_list0)# print(a_list)si_p = []for n in n_list0:try:s = co_model.similarity(n, '手机')si_p.append(s)except Exception as e:si_p.append(0)index_list = list(map(si_p.index, heapq.nlargest(int(0.8*len(si_p)), si_p))) #取出和手机相关度最高的nn_list = []for index in index_list:n_list.append(n_list0[index])# print(n_list)return n_list, a_listdef simlarity(self, n_list0, a_list):"""计算相似度,进行正逆向匹配,筛选出名词和形容词的最佳搭配"""n_list0 = n_list0a_list = a_listco_model = Word2Vec.load('coseg_text.model')si_p = []for n in n_list0:try:s = co_model.similarity(n, '手机')si_p.append(s)except Exception as e:si_p.append(0)index_list = list(map(si_p.index, heapq.nlargest(int(0.8*len(si_p)), si_p))) #取出和手机相关度最高的nn_list = []for index in index_list:n_list.append(n_list0[index])# 名词正向匹配comment1_df = pd.DataFrame(columns=['comment_tag', 'similarity'], index=[np.arange(100)])index = 0for i in range(len(n_list)):f_si = 0for j in range(len(a_list)):try:si = co_model.similarity(n_list[i], a_list[j])if si >= f_si:f_si = sicomment_tag = n_list[i] + a_list[j]else:f_si = f_siexcept Exception as e:print('语料库中缺少该词', e)comment1_df.loc[index, ] = [comment_tag, f_si]index += 1comment1_df = comment1_df.sort_values(by='similarity', ascending=False, ignore_index=True)comment1_df.dropna(subset=['comment_tag'], inplace=True)# comment1_df = comment1_df.iloc[0: int(0.2*len(comment_df)), ]# 形容词匹配逆向匹配comment2_df = pd.DataFrame(columns=['comment_tag', 'similarity'], index=[np.arange(100)])index = 0for i in range(len(a_list)):f_si = 0for j in range(len(n_list)):try:si = co_model.similarity(n_list[j], a_list[i])if si >= f_si:f_si = sicomment_tag = n_list[j] + a_list[i]else:f_si = f_siexcept Exception as e:print('语料库中缺少该词', e)comment2_df.loc[index, ] = [comment_tag, f_si]index += 1comment2_df = comment2_df.sort_values(by='similarity', ascending=False, ignore_index=True)comment1_df.dropna(subset=['comment_tag'], inplace=True)comment_df = pd.merge(comment1_df, comment2_df, on='comment_tag', how='inner')comment_df.dropna(subset=['comment_tag'], inplace=True)return comment_dfdef cleandata(self, x):"""对数据进行清洗,替换一些不规则的标点符号"""pat = re.compile("[^\u4e00-\u9fa5^.^a-z^A-Z^0-9]")  # 只保留中英文,去掉符号x = x.replace(' ', ',')emoji.demojize(x)  # 去掉表情表情符号x = re.sub(pat, ',', x)return x

第二步:提取实体和相关实体信息


```python
# -*- coding:utf-8 -*-
import os
from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller
from gensim.models import Word2Vec
from cixing import Sentence_Parser
import pandas as pd
import numpy as np
import heapq
import re
import emojiclass Extractor:def __init__(self):self.co_model = Word2Vec.load('coseg_text.model')self.parser = Sentence_Parser()def get_seginfo(self, comment_list):for c in range(len(comment_list)):if len(comment_list[c]) <= 200:sentence = comment_list[c]else:sentence = comment_list[c][0: 201]if sentence != '':sentence = self.parser.cleandata(sentence)words, postags, child_dict_list, roles_dict, format_parse_list = self.parser.parser_main(sentence)n_list, a_list = self.parser.select(words, postags)tags = []for j in range(len(a_list)):# print(child_dict_list[j])p = words.index(a_list[j])if child_dict_list[p]:# print(child_dict_list[p])# 构成的是主谓关系if 'SBV' in child_dict_list[p]:# print(child_dict_list[p])si_p = []for po in child_dict_list[p]['SBV']:try:si = self.co_model.similarity(words[po], '手机')si_p.append(si)except Exception as e:si_p.append(0)id = list(map(si_p.index, heapq.nlargest(1, si_p)))  # 和该形容词最高的名词s = child_dict_list[p]['SBV'][id[0]]w1 = words[s] + a_list[j]if child_dict_list[s]:# print(child_dict_list[s])if 'ATT' in child_dict_list[s]:if postags[child_dict_list[s]['ATT'][0]] == 'n':w2 = words[child_dict_list[s]['ATT'][0]] + w1tags.append(w2)else:tags.append(w1)else:tags.append(w1)if 'ATT' in child_dict_list[p]:# print(child_dict_list[p])s = child_dict_list[p]['ATT'][0]if 'SBV' in child_dict_list[s]:w3 = words[child_dict_list[s]['SBV'][0]]w4 = w3 + a_list[j]id1 = words.index(w3)if child_dict_list[id1]:if 'ATT' in child_dict_list[id1]:if postags[child_dict_list[id1]['ATT'][0]] == 'n':w5 = words[child_dict_list[id1]['ATT'][0]] + w4tags.append(w5)else:tags.append(w4)with open('F:\pycharm project data\\taobao\phone\\tags.txt', 'a') as t:t.writelines(' '.join(tags))t.writelines('\n')# f.close()print(tags)# 获取相关的名词和用户组n_list = list(set(n_list))if n_list:with open('F:\pycharm project data\\taobao\phone\\noun.txt', 'a') as f:f.writelines(' '.join(n_list))f.writelines('\n')# f.close()si_p = []u_list = ['小孩子', '作业', '高中', '初中', '儿童', '学校', '小孩', '老师', '网瘾', '中学生', '小学', '女儿', '小学生', '孩子', '闺女', '儿子', '学生', '网课', '小朋友','同事', '表弟', '亲戚', '姐妹', '表哥', '邻居', '同学', '朋友', '盆友', '链接','姥姥', '老太太', '老人', '岳母', '父亲', '老娘', '小姨', '老丈人', '舅舅', '岳父', '亲人', '老妈子', '老头儿', '婆婆', '老太', '老头子', '父母', '家婆', '老父亲', '老爹', '长辈', '大人', '外爷', '爷爷', '我爸', '老头', '老妈', '老爷子', '爸妈', '奶奶', '老伴', '老爸', '母亲', '老人家', '妈妈', '公公', '爸爸', '丈母娘', '姥爷', '家里人', '家人','老奶奶', '小伙子', '阿姨', '娘娘', '小姑子', '姐姐', '老妹', '婶婶', '大姐', '外孙', '小屁孩', '孙子', '姨妈', '棉袄', '伯母', '孝心','媳妇', '妹妹', '男朋友', '对象', '生日', '女朋友', '男票', '老婆', '弟弟', '情人节', '爹妈', '麻麻', '老公', '外甥', '老弟']# print(n_list)# print(n_list)for n in range(len(n_list)):for u in range(len(u_list)):try:s = self.co_model.similarity(n_list[n], u_list[u])si_p.append(s)except Exception as e:si_p.append(0)index_list = list(map(si_p.index, heapq.nlargest(1, si_p)))  # 取出和手机相关度最高的n# print(index_list)user_list = []for index in index_list:index = int(index/len(u_list))user_list.append(n_list[index])# print(user_list)with open('F:\pycharm project data\\taobao\phone\\user.txt', 'a') as u:u.writelines(user_list)u.writelines('\n')# f.close()t.close()f.close()u.close()

第三步:测试数据以及测试模型

# -*- coding:utf-8 -*-
import os
from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller
from gensim.models import Word2Vec
import pandas as pd
import numpy as np
import heapq
import re
import emoji
from extractor import Extractorpd.set_option('display.max_columns', 100)
pd.set_option('display.max_rows', 5000)
pd.set_option('max_colwidth', 30)
pd.set_option('display.width', 1000)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)# 一、数据处理
# 导入数据
df = pd.read_csv('F:\pycharm project data\\taobao\phone\\comment1.csv', encoding='utf-8-sig')
# 提取评论数据
co_df = df[['content']]
co_df = co_df.loc[co_df['content'] != '15天内买家未作出评价', ['content']]
co_df = co_df.loc[co_df['content'] != '评价方未及时做出评价,系统默认好评!', ['content']]
comment_list = co_df['content'].tolist()if __name__ == '__main__':myextractor = Extractor()#myextractor.get_seginfo(comment_list)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文本对抗攻击入坑宝典

文 | 阿毅编 | 小轶如果是咱家公众号的忠实粉丝就一定还记得之前咱家一篇关于NLP Privacy的文章&#xff0c;不出意外的话&#xff0c;你们是不是现在依然还担心自己的隐私被输入法窃取而瑟瑟发抖。所以&#xff0c;我们又来了&#xff01;今天给大家讨论的是NLP Privacy中一个…

Android官方开发文档Training系列课程中文版:创建自定义View之View的交互

写在前面的话:这一章很有价值&#xff0c;想要提升安卓知识的一定要读一读。不做安卓的也可以得到其它方面的提升。 原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/making-interactive.html UI的绘制只是自定义View的一部分。你还需要使View可以以…

LeetCode 350. 两个数组的交集 II(哈希)

文章目录1. 题目2. 解题2.1 hash2.2 数组已排序1. 题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1:输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2,2] 示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [4,9] 说明&#xff1a;输出结果中每个元…

会议交流 | CCKS2020 第十四届全国知识图谱与语义计算大会

CCKS2020第十四届全国知识图谱与语义计算大会China Conference on Knowledge Graph and Semantic Computing, 2020南昌.江西&#xff0c;11月12日-15日主办: 中国中文信息学会语言与知识计算专业委员会承办: 江西师范大学会议网站&#xff1a;www.sigkg.cn/ccks2020大会主题&a…

用微前端的方式搭建类单页应用

前言 微前端由ThoughtWorks 2016年提出&#xff0c;将后端微服务的理念应用于浏览器端&#xff0c;即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。 美团已经是一家拥有几万人规模的大型互联网公司&#xff0c;提升整体效率至关重要&#xff0c;这需要很…

Android官方开发文档Training系列课程中文版:创建自定义View之View的优化

原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/optimizing-view.html 现在已经完成了一个拥有良好设计的View&#xff0c;它即可以响应手势&#xff0c;又可以在状态之间过渡。为了避免View有卡顿的感觉&#xff0c;需要确保动画始终是按照每秒60帧…

12种NumpyPandas高效技巧

文 | Kunal Dhariwal本文分享给大家 12 种 Numpy 和 Pandas 函数&#xff0c;这些高效的函数会令数据分析更为容易、便捷。最后&#xff0c;读者也可以在 GitHub 项目中找到本文所用代码的 Jupyter Notebook。项目地址&#xff1a;https://github.com/kunaldhariwal/12-Amazing…

LeetCode 1002. 查找常用字符(哈希)

1. 题目 给定仅有小写字母组成的字符串数组 A&#xff0c;返回列表中的每个字符串中都显示的全部字符&#xff08;包括重复字符&#xff09;组成的列表。例如&#xff0c;如果一个字符在每个字符串中出现 3 次&#xff0c;但不是 4 次&#xff0c;则需要在最终答案中包含该字符…

抖音算法推荐机制详解

抖音算法推荐机制详解&#xff01;&#xff08;科普向&#xff09; 众所周知抖音的流量分配是去中心化的&#xff0c;这种去中心化算法&#xff0c;让每个人都有机会爆红&#xff0c;可为什么别人几个粉玩抖音&#xff0c;就能轻松获得10w点赞?而你怒拍几十条也枉然? 抖音的…

论文浅尝 - ICLR2020 | 用于半监督分类的图形推理学习

论文笔记整理&#xff1a;周虹廷&#xff0c;浙江大学研究生。研究方向&#xff1a;知识图谱&#xff0c;图表示学习等。论文链接&#xff1a;https://arxiv.org/pdf/2001.06137.pdf本文是发表在ICLR2020上针对图数据做节点半监督分类任务的论文。现有的算法解决图上节点分类问…

WMRouter:美团外卖Android开源路由框架

WMRouter是一款Android路由框架&#xff0c;基于组件化的设计思路&#xff0c;功能灵活&#xff0c;使用也比较简单。 WMRouter最初用于解决美团外卖C端App在业务演进过程中的实际问题&#xff0c;之后逐步推广到了美团其他App&#xff0c;因此我们决定将其开源&#xff0c;希望…

Android官方开发文档Training系列课程中文版:管理系统UI之变暗系统条

原文地址&#xff1a;http://android.xsoftlab.net/training/system-ui/index.html 引言 系统条(System Bars)是屏幕上的一块显示区域&#xff0c;专门用来显示通知&#xff0c;设备的通讯状态以及设备的导向。典型的System Bars与APP同时显示在屏幕上。APP展示了具体的内容&…

实话实说:中文自然语言处理的N个真实情况

文 | Liu Huanyong按语中文自然语言处理&#xff0c;目前在AI泡沫之下&#xff0c;真假难辨&#xff0c;实战技术与PPT技术往往存在着很大的差异。目前关于AI或者自然语言处理&#xff0c;做的人与讲的人往往是两回事。作者简介Liu Huanyong&#xff0c;就职于中国科学院软件研…

Android官方开发文档Training系列课程中文版:管理系统UI之隐藏状态条

原文地址&#xff1a;http://android.xsoftlab.net/training/system-ui/status.html 这节课将会介绍如何隐藏不同的版本的状态条。隐藏状态条可以使内容展示区域更大&#xff0c;因此可以提供一种更强的身临其境的用户体验。 含有状态条的APP&#xff1a; 隐藏状态条的APP&am…

python实现大批量pdf格式论文的重命名与目录制作功能

Python实现批量PDF文件统计处理&#xff1a;https://www.jianshu.com/p/1ec8f4314611 第一步&#xff1a;批量读取pdf文件 # -*- coding: utf-8 -*- """ Created on Sat Jun 8 15:30:22 2019 author: Administrator """import os from io impo…

论文浅尝 - ACL2020 | 用于回答知识库中的多跳复杂问题的查询图生成方法

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;ACL 2020链接&#xff1a;https://www.aclweb.org/anthology/2020.acl-main.91.pdf1.介绍在以往的工作中&#xff0c;知识图谱复杂问答一般被分为两种类型分别处理&#xff1a;其一是带有约束的问题&…

深入理解JSCore

背景 动态化作为移动客户端技术的一个重要分支&#xff0c;一直是业界积极探索的方向。目前业界流行的动态化方案&#xff0c;如Facebook的React Native&#xff0c;阿里巴巴的Weex都采用了前端系的DSL方案&#xff0c;而它们在iOS系统上能够顺利的运行&#xff0c;都离不开一个…

Android官方开发文档Training系列课程中文版:手势处理之监测通用手势

原文地址&#xff1a;http://android.xsoftlab.net/training/gestures/index.html 引言 这节课将会学习如何让用户通过触摸手势与APP产生交互。Android提供了许多相关API来帮助你创建、检测手势。 尽管APP不应该将触摸手势作为基本的输入特性&#xff0c;但是触摸手势可以使…

全球44家机构,55位大佬,历时两年,打造最强NLG评测基准!

文 | 小轶&#xff08;大家好&#xff0c;我是已经鸽了夕总仨月没写文章了的小轶&#xff08;y&#xff09;&#xff01;新的一年一定改过自新&#xff0c;多读paper多写稿&#xff0c;望广大读者敦促(ง •̀_•́)ง&#xff09;今天要和大家分享的是卖萌屋学术站上的本月最热…

LeetCode 171. Excel表列序号(26进制转10进制)

1. 题目 给定一个Excel表格中的列名称&#xff0c;返回其相应的列序号。 例如&#xff0c;A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 输入: "A" 输出: 1输入: "AB" 输出: 28输入: "ZY" 输出: 701来源&#xff1a;力扣&…