目标:
1.掌握SDK文档的使用
2.强化tkinter图像界面的编辑
ttk.Treeview()创建列表,以及树状结构
3.递归函数的使用
百度参考文档:https://ai.baidu.com/docs#/NLP-Python-SDK/top
图形界面
源代码
# 导包
from aip import AipNlp #百度文本分析api
from tkinter import * #python界面开发
from tkinter import ttk
from tkinter.filedialog import askopenfilename,askdirectory
class Text_analysis():
"""
SDK开发
"""
def __init__(self):
# 参数初始化化
""" 你的 APPID AK SK """
self.APP_ID = '175243421'
self.API_KEY = 'QvXanIzUbqWTmQQhkqDGG3WY'
self.SECRET_KEY = 'LtbuUbj7yk9NxX86QN1iO3XcAc7gl4ln'
self.client = AipNlp(self.APP_ID, self.API_KEY, self.SECRET_KEY)
self.myWindow = Tk()
self.text_1=StringVar()
self.text_2=StringVar()
self.text_3 = StringVar() #短文本相似度
self.text_4 = StringVar() # 词向量
self.text_5 = StringVar() # 词1
self.text_6 = StringVar() # 词2
self.text_7 = StringVar() # 词相似结果
self.text_8 = StringVar() # 文本标题
self.model=StringVar() #文本相似度模型
self.model_1=StringVar() #文本相似度模型
self.industry=StringVar() #行业
self.tree_list=[]
self.tree_dict={}
def tree(self,value):
# self.tree=ttk.Treeview()
tree={}
postag={'Ag':'形语素','g':'语素','ns':'地名' ,'u':'助词','a': '形容词','h':'前接成分' ,'nt': '机构团体', 'vg':'动语素',
'ad': '副形词', 'i': '成语', 'nz': '其他专名', 'v': '动词',
'an' :'名形词', 'j': '简称略语', 'o': '拟声词', 'vd': '副动词',
'b': '区别词', 'k': '后接成分' ,'p': '介词', 'vn': '名动词',
'c': '连词', 'l': '习用语', 'q': '量词', 'w': '标点符号',
'dg': '副语素', 'm': '数词', 'r': '代词', 'x' :'非语素字',
'd': '副词' ,'Ng': '名语素', 's' :'处所词', 'y': '语气词',
'e': '叹词', 'n': '名词', 'tg': '时语素', 'z': '状态词',
'f': '方位词', 'nr': '人名', 't': '时间词', 'un': '未知词'}
deprel={ 'ATT':'定中关系','QUN':'数量关系','COO':'并列关系','APP':'同位关系','ADJ':'附加关系',
'VOB': '动宾关系', 'POB': '介宾关系', 'SBV': '主谓关系', 'SIM': '比拟关系', 'TMP': '时间关系',
'LOC': '处所关系', 'DE': '“的”字结构', 'DI': '“地”字结构', 'DEI': '“得”字结构', 'SUO': '“所”字结构',
'BA': '“把”字结构', 'BEI': '“被”字结构', 'ADV': '状中结构', 'CMP': '动补结构', 'DBL': '兼语结构',
'CNJ': '关联词', 'CS': '关联结构', 'MT': '语态结构', 'VV': '连谓结构', 'HED': '核心', 'FOB': '前置宾语',
'DOB': '双宾语', 'TOP': '主题', 'IS': '独立结构', 'IC': '独立分句', 'DC': '依存分句', 'VNV': '叠词关系',
'YGC': '一个词', 'WP': '标点'}
# print(value)
if len(value)>0:
for item in value:
if len(self.tree_list)==0:
if item['head']==0:
name_1='head_'+str(item['id'])
self.tree_list.append('head_'+str(item['id']))
# print('插入一级树'+str(item['word']))
# self.tree_dict[name_1]=self.tree_3.insert("",item['id'],text=str(item['word'])+'('+deprel[item['deprel']]+')',values=(str(item['id'])),open=True)
self.tree_dict[name_1] = self.tree_3.insert("", item['id'],text=str(item['word']) + '(' + deprel[item['deprel']] + ')', open=True)
value.remove(item)
break
elif 'head_'+str(item['head']) in self.tree_list:
name_2 = 'head_' + str(item['id'])
self.tree_list.append('head_' + str(item['id']))
# self.tree_dict[name_2] = self.tree_3.insert(self.tree_dict['head_'+str(item['head'])], 'end', text=str(item['word'])+'('+deprel[item['deprel']]+')', values=(str(item['id'])),open=True)
self.tree_dict[name_2] = self.tree_3.insert(self.tree_dict['head_' + str(item['head'])], 'end',text=str(item['word']) + '(' + deprel[ item['deprel']] + ')', open=True)
# print('插入下一级树'+str(item['word']))
value.remove(item)
break
self.tree(value)
return None
def lexical_analysis(self):
'''
词法分析
:return:
'''
pos={'n': '普通名词', 'f': '方位名词', 's': '处所名词', 't': '时间名词',
'nr': '人名', 'ns': '地名', 'nt' :'机构团体名', 'nw': '作品名',
'nz': '其他专名', 'v': '普通动词', 'vd': '动副词', 'vn': '名动词',
'a': '形容词', 'ad': '副形词', 'an': '名形词', 'd': '副词',
'm': '数量词', 'q': '量词', 'r': '代词', 'p': '介词',
'c' :'连词','u' : '助词', 'xc': '其他虚词', 'w': '标点符号'}
ne={'PER': '人名', 'LOC': '地名', 'ORG': '机构名', 'TIME': '时间'}
items = self.tree_1.get_children()
[self.tree_1.delete(item) for item in items]
text = self.text_1.get()
# print(text)
""" 调用词法分析 """
results=self.client.lexer(text)
if 'error_code'in results:
print(results)
else:
for i,result in enumerate(results['items']):
if len(result['pos']):
string_1=pos[result['pos']]
elif len(result['ne']):
string_1=ne[result['ne']]
self.tree_1.insert('', i, values=(str(i+1),result['item'],string_1,'/'.join(result['basic_words'])))
# tree.bind("", onDBClick) #绑定按键功能
# self.tree_1.pack()
def syntax_analysis(self):
'''
依存句法分析
:return:
'''
self.tree_list.clear()
self.tree_dict.clear()
items = self.tree_3.get_children()
[self.tree_3.delete(item) for item in items]
text=self.text_1.get()
mode={'Web模型':0,'Query模型':1}
""" 如果有可选参数 """
options = {}
options["mode"] = mode[self.com_1.get()]
""" 带参数调用依存句法分析 """
results=self.client.depParser(text, options)
# print(results)
self.tree(results["items"])
# print(result)
def language_model(self):
'''
语言模型
:return:
'''
items = self.tree_2.get_children()
[self.tree_2.delete(item) for item in items]
text = self.text_1.get()
""" 调用DNN语言模型 """
results=self.client.dnnlm(text)
self.text_2.set(results['ppl'])
for i, result in enumerate(results['items']):
self.tree_2.insert('', i, values=(str(i + 1), result["word"], result["prob"]))
def text_similar(self):
'''
短文本相似度
:return:
'''
text1=self.text_21.get(1.0,5.0)
text2=self.text_22.get(1.0,5.0)
options = {}
options["model"] = self.com.get()
""" 带参数调用短文本相似度 """
result=self.client.simnet(text1, text2,options )
self.text_3.set(result['score'])
# print('计算短文本相似度')
def commentary_get(self):
'''
评论观点抽取
:return:
'''
sentiments = {0: '消极', 1: '中性', 2: '积极'}
self.text_32.delete(1.0, 'end') # 删除文本框内容
text=self.text_31.get(1.0,5.0)
indust_dict={'酒店':1, 'KTV':2,'丽人':3,'美食餐饮':4,'旅游':5,'健康':6,'教育':7,'商业':8,'房产':9,'汽车':10,'生活':11,'购物':12,'3C':13}
options = {}
options["type"] = indust_dict[self.com_31.get()]
""" 带参数调用评论观点抽取 """
result=self.client.commentTag(text, options)
# print(result)
x=len(result['items'])-1
i=0
for item in result['items']:
a='观点倾向:'+str(sentiments[item['sentiment']])+'\n'+'短句摘要:'+item['abstract']+'\n'+'匹配属性词:'+item['prop']+'\n'+'匹配描述词:'+item['adj']+'\n'
# print(a)
self.text_32.insert('insert',a)
if i