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)



posted @ 2018-02-01 14:21  今夜无风  阅读(231)  评论(0编辑  收藏  举报