估计这是6月份最后一篇博客了,这个月好像产出没那么多,可能是因为一直在忙于开题的事,所以没有太多的心思放在码代码上,所以这篇博客要发布我最新使用“全N-gram”算法来对问题进行搜索,准确率还是很高的,希望大家可以在刚开始做问答的时候能用到。
# -*- coding:utf-8 -*-
import simple_so as so
def i_question():
print('请输入问题')
question = input()
return question
'''使用n-gram算法进行问题分析'''
def gram():
question = i_question()
n_word = []
for i in range(len(question)+2):
for n in range(len(question)):
one_anw = question[n:n+i-1]
if one_anw != '' and len(one_anw) >= 2 and one_anw not in n_word:
n_word.append(one_anw)
else:
continue
return n_word
'''对每个组进行问题搜索'''
def seanswer():
set_answer = []
ron_answer = []
n_word = gram()
for key_word in n_word:
answer = so.QA(key_word)
if answer != []:
set_answer.append(answer)
else:
continue
for i in range(len(set_answer)):
ron_answer.extend(set_answer[i])
return ron_answer
'''将排名前20个的答案提出来'''
def freq():
counter = {}
ron_answer = seanswer()
for k in ron_answer:
counter[k] = counter.get(k,0) + 1
Freq = sorted([(freq,word) for word ,freq in counter.items()],reverse=True)[:20]
for item in Freq:
print(item)
def main():
freq()
if __name__ == '__main__':
main()
这里面是我随意从问答库中选择的一个问题和答案的截图,请注意问题的叙述,这和接下来输入问题的问法是不同的。
当我输入想要的问题后,程序把前20中最后可能是答案的句子输出了,可以看到,第一行的是34次,因此,我们可以认为该句子就是最正确的答案,其余的句子可以忽略。大家可以只输出第一个句子作为答案。
大家有什么对问答系统想了解或者有什么好的算法的,欢迎大家积极留言。