python问答模块
1 """ 2 该模块功能:获取用户的输入文本,通过输入文本和数据库中的关键主题文本相比较, 3 获取最佳的回答内容 4 """ 5 import xlrd 6 import jieba 7 import nltk 8 9 10 # 读取excel表格内的数据 11 def read_excel(filepath): 12 # 定义一个字典,动态建立一个字典 13 map_dict = {} 14 data = xlrd.open_workbook(filepath) 15 table = data.sheets()[0] 16 # 获取表格行数和列数 17 nrows = table.nrows 18 ncols = table.ncols 19 # 获取表格第1列的内容,内容是一个list 20 s = table.col_values(1)[1:] 21 # 获取长度 22 length = len(s) 23 # 迭代每一个元素进行处理 24 for each in range(length): 25 each_string = s[each] 26 # 分离出title和对应的解释 27 word_key, word_value = each_string.split(':') 28 # 把数据放入一个字典中,以键值对的形式存在 29 map_dict[word_key] = word_value 30 31 print(map_dict) 32 return map_dict 33 # 已经将数据放入到字典里,接下来是使用数据了 34 # 通过语音输入一个关键字,这个关键字对应字典的键,采用什么样的模型实现这两个的映射,找到对应的键值就可以找到需要的答案,这就是思路 35 36 # 假设已经获得了一个输入字符 37 # input_string = "货币型基金" 38 # 获取字典的键 39 # title_key = list(map_dict.keys()) 40 # print(title_key) 41 42 # 中间环节,实现input_string和title_key 的映射,相似度匹配 43 44 45 # 最后,根据键获取值 46 # content_value = map_dict.get(input_string) 47 # print(content_value) 48 49 # 统计key中各个词频 50 def solve_word(word_key): 51 seg_list = [] 52 53 for each in word_key: 54 temp_string = list(jieba.cut(each)) 55 seg_list.extend(temp_string) 56 print(len(seg_list)) 57 # 得到结果列表 58 seg_list = set(seg_list) 59 print(seg_list) 60 61 62 # 计算两句话的相似程度模板 63 # 句子A:我喜欢看电视,不喜欢看电影。 64 # 句子B:我不喜欢看电视,也不喜欢看电影。 65 def calc_sentence_similarity(sentence_A, sentence_B): 66 # sentence_A = "我喜欢看电视,不喜欢看电影" 67 # sentence_B = "我不喜欢看电视,计算两句话的相似程度模板" 68 69 # 第一步,分词 70 segment_A = list(jieba.cut(sentence_A)) 71 segment_B = list(jieba.cut(sentence_B)) 72 # print(segment_A) 73 # print(segment_B) 74 75 # 第二步,列出所有的词 76 all_words = set(segment_A + segment_B) 77 # print(all_words) 78 79 # 第三步,统计词频。放到字典里面,遍历all_words,看句子A和句子B都是各有多少 80 # 句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。 81 # 句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。 82 frequency_dict_A = {} 83 frequency_dict_B = {} 84 if all_words is not None: 85 for t in all_words: 86 frequency_dict_A[t] = segment_A.count(t) 87 frequency_dict_B[t] = segment_B.count(t) 88 # print(frequency_dict_A) 89 # print(frequency_dict_B) 90 91 # 第四步,写出词频向量 92 word_frequency_vector_A = list(frequency_dict_A.values()) 93 word_frequency_vector_B = list(frequency_dict_B.values()) 94 # print(word_frequency_vector_A) 95 # print(word_frequency_vector_B) 96 97 # 第五步,计算两个向量的相似度,夹角的余弦 98 return cos_vector(word_frequency_vector_A, word_frequency_vector_B) 99 100 101 def cos_vector(x, y): 102 if(len(x) != len(y)): 103 print('输入错误,两个向量不在一个向量空间') 104 return 105 result1 = 0.0 106 result2 = 0.0 107 result3 = 0.0 108 for i in range(len(x)): 109 result1 += x[i]*y[i] #sum(X*Y) 110 result2 += x[i]**2 #sum(X*X) 111 result3 += y[i]**2 #sum(Y*Y) 112 # print("两个向量的夹角的余弦值:"+str(result1/((result2*result3)**0.5))) #结果显示 113 return result1/((result2*result3)**0.5) 114 115 116 # 问句匹配,找出问题的结果 117 def find_result(input_string, word_dict): 118 # 获取用户的输入,将其和数据库中的每一个数据进行对比,计算相似度 119 # input_string = "票汇汇款" 120 temp_dict = {} 121 for temp_string in word_dict.keys(): 122 # 计算相似度,key:要查找的字符串;value:相似度的值。max(d.items(),key=lambda x:x[1])[0] 123 temp_dict[temp_string] = calc_sentence_similarity(input_string, temp_string) 124 125 max_value_key = max(temp_dict, key=temp_dict.get) 126 # 得到对应的文本 127 text_result = word_dict.get(max_value_key) 128 print(max_value_key) 129 print(text_result) 130 131 # 调用主程序 132 def read_get_answer(file_path, input_string): 133 # 数据源, file_path = "./data/word_instruction.xls" 134 # 获取用户文本, input_string = "我想知道什么是止付卡" 135 # 读入数据,返回字典 136 word_dict = read_excel(file_path) 137 # 计算相似度 138 find_result(input_string, word_dict) 139 140 141 if __name__ == '__main__': 142 # 数据源 143 file_path = "./data/word_instruction.xls" 144 # 获取用户文本 145 input_string = "我想知道什么是止付卡" 146 # 读入数据,返回字典 147 word_dict = read_excel(file_path) 148 # 计算相似度 149 find_result(input_string, word_dict)
"""
该模块功能:获取用户的输入文本,通过输入文本和数据库中的关键主题文本相比较,
获取最佳的回答内容
"""
import xlrd
import jieba
import nltk
# 读取excel表格内的数据
def read_excel(filepath):
# 定义一个字典,动态建立一个字典
map_dict = {}
data = xlrd.open_workbook(filepath)
table = data.sheets()[0]
# 获取表格行数和列数
nrows = table.nrows
ncols = table.ncols
# 获取表格第1列的内容,内容是一个list
s = table.col_values(1)[1:]
# 获取长度
length = len(s)
# 迭代每一个元素进行处理
for each in range(length):
each_string = s[each]
# 分离出title和对应的解释
word_key, word_value = each_string.split(':')
# 把数据放入一个字典中,以键值对的形式存在
map_dict[word_key] = word_value
print(map_dict)
return map_dict
# 已经将数据放入到字典里,接下来是使用数据了
# 通过语音输入一个关键字,这个关键字对应字典的键,采用什么样的模型实现这两个的映射,找到对应的键值就可以找到需要的答案,这就是思路
# 假设已经获得了一个输入字符
# input_string = "货币型基金"
# 获取字典的键
# title_key = list(map_dict.keys())
# print(title_key)
# 中间环节,实现input_string和title_key 的映射,相似度匹配
# 最后,根据键获取值
# content_value = map_dict.get(input_string)
# print(content_value)
# 统计key中各个词频
def solve_word(word_key):
seg_list = []
for each in word_key:
temp_string = list(jieba.cut(each))
seg_list.extend(temp_string)
print(len(seg_list))
# 得到结果列表
seg_list = set(seg_list)
print(seg_list)
# 计算两句话的相似程度模板
# 句子A:我喜欢看电视,不喜欢看电影。
# 句子B:我不喜欢看电视,也不喜欢看电影。
def calc_sentence_similarity(sentence_A, sentence_B):
# sentence_A = "我喜欢看电视,不喜欢看电影"
# sentence_B = "我不喜欢看电视,计算两句话的相似程度模板"
# 第一步,分词
segment_A = list(jieba.cut(sentence_A))
segment_B = list(jieba.cut(sentence_B))
# print(segment_A)
# print(segment_B)
# 第二步,列出所有的词
all_words = set(segment_A + segment_B)
# print(all_words)
# 第三步,统计词频。放到字典里面,遍历all_words,看句子A和句子B都是各有多少
# 句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。
# 句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。
frequency_dict_A = {}
frequency_dict_B = {}
if all_words is not None:
for t in all_words:
frequency_dict_A[t] = segment_A.count(t)
frequency_dict_B[t] = segment_B.count(t)
# print(frequency_dict_A)
# print(frequency_dict_B)
# 第四步,写出词频向量
word_frequency_vector_A = list(frequency_dict_A.values())
word_frequency_vector_B = list(frequency_dict_B.values())
# print(word_frequency_vector_A)
# print(word_frequency_vector_B)
# 第五步,计算两个向量的相似度,夹角的余弦
return cos_vector(word_frequency_vector_A, word_frequency_vector_B)
def cos_vector(x, y):
if(len(x) != len(y)):
print('输入错误,两个向量不在一个向量空间')
return
result1 = 0.0
result2 = 0.0
result3 = 0.0
for i in range(len(x)):
result1 += x[i]*y[i] #sum(X*Y)
result2 += x[i]**2 #sum(X*X)
result3 += y[i]**2 #sum(Y*Y)
# print("两个向量的夹角的余弦值:"+str(result1/((result2*result3)**0.5))) #结果显示
return result1/((result2*result3)**0.5)
# 问句匹配,找出问题的结果
def find_result(input_string, word_dict):
# 获取用户的输入,将其和数据库中的每一个数据进行对比,计算相似度
# input_string = "票汇汇款"
temp_dict = {}
for temp_string in word_dict.keys():
# 计算相似度,key:要查找的字符串;value:相似度的值。max(d.items(),key=lambda x:x[1])[0]
temp_dict[temp_string] = calc_sentence_similarity(input_string, temp_string)
max_value_key = max(temp_dict, key=temp_dict.get)
# 得到对应的文本
text_result = word_dict.get(max_value_key)
print(max_value_key)
print(text_result)
# 调用主程序
def read_get_answer(file_path, input_string):
# 数据源, file_path = "./data/word_instruction.xls"
# 获取用户文本, input_string = "我想知道什么是止付卡"
# 读入数据,返回字典
word_dict = read_excel(file_path)
# 计算相似度
find_result(input_string, word_dict)
if __name__ == '__main__':
# 数据源
file_path = "./data/word_instruction.xls"
# 获取用户文本
input_string = "我想知道什么是止付卡"
# 读入数据,返回字典
word_dict = read_excel(file_path)
# 计算相似度
find_result(input_string, word_dict)
时刻记着自己要成为什么样的人!