上周写了序列对匹配算法,并通过序列对匹配算法对词语进行相似度匹配,后面肯定还要更换词语的相似度匹配算法,现在先基于之前的工作进一步完成。
然后再明确一下程序的输入输出:程序的输入一个是学生答案,即一段文本,文本中可能包含多个句子。二是标准答案即对应分值,标准答案含有多个句子,分别输入每个句子即对应分值,分值总和加起来为10分。程序的输出即为学生答案的得分了,得分为0-10间的整数。
下面根据句子的相似度实现两个段落间的相似度,传入的p1为一个整的字符串,代表学生答案,传入的p2为一个字符串列表,代表标准答案中的每个要点,point为一个整数列表,代表对应于p2中每个要点的分值情况,代码如下:
'''
实现两个段落的相似度
p1为学生答案,按照段落整段给出,需要通过句号划分
p2为标准答案列表
point为对应每个标答的分值
'''
def ParagraphSimilar(p1,p2,point): # 计算两个段落的相似度
p1 = p1.split('。')
p1 = list(filter(None,p1)) # 去除list中的空字符
len1 = len(p1)
len2 = len(p2)
MP = [ [0] * len2 for i in range(len1) ] # 初始化句子相似度矩阵
for i in range(len1):
for j in range(len2):
MP[i][j] = SentencesSimilar(p1[i],p2[j]) # 计算每个句子相似度值
__str__(len1,len2,MP)
maxMP = [] # 每轮找出MS中的最大值加入到maxMP,并删除其所在的行列
while True:
loc = (0,0,0) # 记录句1位置、句2位置,两个句子间相似度
for i in range(len1): # 找出MS中的最大值
for j in range(len2):
if MP[i][j] > loc[2]:
loc = (i,j,MP[i][j])
if loc