字符串标准答案与所填答案的比较

baobao28 2006-12-27 02:33:06
求一个算法实现如下功能

标准答案:今天是个好天气

所填答案:
答案1:今天是个坏天气
答案2:今天是个不好的天气
答案3:今天不是个好天气
答案4:今天好天气
答案5:好天气

返回:
答案1:错误答案
答案2:错误答案
答案3:错误答案
答案4:71%接近标准答案
答案5:43%接近标准答案
...全文
1030 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
SZleoWang 2006-12-29
  • 打赏
  • 举报
回复
这个确实有难度...不过要对所有可能的正确答案都能识别,哪太大了
errorlogin 2006-12-29
  • 打赏
  • 举报
回复
只能说,现在的老师太懒了,连改卷子都想自动!这样对教育是多大的伤害?
leechiyang 2006-12-29
  • 打赏
  • 举报
回复
要能让计算机达到语义识别,你就牛B了。
态度决定品质 2006-12-29
  • 打赏
  • 举报
回复
关键字:今天 是 好 天气
是 表示判断,缺省值为“是”
关键字:最高:好 天气
次高:今天
态度决定品质 2006-12-29
  • 打赏
  • 举报
回复
1 提取答案主干句
2 划分关键之登记
3 比较
kubernetes-k8s 2006-12-28
  • 打赏
  • 举报
回复
人工智能方面了,
貌似用字符串比较是不能得出很好的结论的
而且很有局限性,相当于“匹配”了
baobao28 2006-12-28
  • 打赏
  • 举报
回复
大家有好的想法,继续帮我跟帖哦,月底前结贴
baobao28 2006-12-28
  • 打赏
  • 举报
回复
没办法,只能用上面的论述去说服客户用人为的方式去阅读,毕竟自己没那能力实现这个功能。尤其是看了人工智能方面的资料,发现想做的更智能,目前还没有那种技术。推荐网址,中国人工智能网http://www.chinaai.org
Sun_19811117 2006-12-28
  • 打赏
  • 举报
回复
好麻烦呢
numen_wlm 2006-12-28
  • 打赏
  • 举报
回复
学习了
baobao28 2006-12-28
  • 打赏
  • 举报
回复
考试系统中简答自动判分实现难点
解决方案1
通过计算标准答案与学生答案在汉字拆分成单字后的互相匹配度,然后再计算标准答案的关键点在学生答案中的涵盖度,再通过设定该试题关键点占本试题得分的百分比系数,通过如下公式计算最后得分。

S = ( P * T1 / n + ( 1 – P ) T2 ) * S0

公式中个符号定义如下:
S: 学生的最后得分
P: 关键点得分占本题总得分的百分比
T1:学生回答出关键点的数量
n: 本试题总关键点的数量
T2:学生答案与标准答案的单项贴近度
S0:本题的总得分

该方案的难点及问题集中在以下几方面:
 关于学生答案与标准答案的相似度
如果简单的从每个字在标准答案中出现的次数,以及在学生答案中的出现次数来衡量相似度,从目前的算法上是可以通过计算机来实现的。
但是如果在语气上与标准答案相反则即便相似度极高也会得到错误的判断。如下例:
标准答案:今天是个好天气
学生答案:今天是个不好的天气

仅仅通过汉字的互相匹配来计算相似度,则得到学生答案与标准答案相似度为:
1. 允许学生答案超过标准答案:100%相似度
2. 不允许学生答案超过标准答案:100% - 20% = 80%
显然学生答案很明显是错误的,仅仅通过汉字的相似程度来计算是不可行的。因为只要学生答案与标准答案语气相反,如标准答案是肯定句,学生答案是否定句或者疑问句则与标准答案语意相反,如果是双重否定句则语意相同,而计算机则无法识别。
 关于定语的反复修饰
我们允许学生的答案有定语的存在,但是反复的修饰则会让计算机糊涂,如下例:
标准答案:今天是个好天气
学生答案:前天的明天的后天昨天是个好天气

计算机识别的是否发现没有今天,则少了一个知识点,得分必然降低。然而,我们仔细的分析学生的答案,会发现学生所说的仍然是今天。
 所填答案为标准答案词汇的组合,且为无序的堆砌
如果通过汉字来判断,且不限制学生答案超过标准答案,则会造成学生答案蒙混过关,如下例:
标准答案:今天是个好天气
学生答案:今天是不是还不是不是也是好天气坏天气不好天气不坏天气

从汉字角度来审核学生答案,则学生答案已经包含了标准答案的所有答案,也就是说计算机会判定学生答案为正确答案。显而易见学生是在胡乱答题堆砌答案,是不应该算正确的。
解决方案2
评分老师预先设定好标准答案的模板,然后通过计算机去那这个模板与学生答案比对,返回学生答案与标准答案之间的相似度。该方案的有点在于可以否定与模板不相容的所有答案,可以不考虑语气语法等问题。

该方案的难点及问题集中在以下几方面:
 模板的定义
评分老师必须预先录好模板,该模板涵盖标准答案允许出现的所有可能性,否则学生答案将得到0分。如下例:
标准答案: 今天是个好天气
模板答案: 今天 是 个 好 (的) 天气
学生答案1:今天不是个好天气
学生答案2:好天气
学生答案3:昨天是个好天气
学生答案4:今天是个凉爽的好天气

通过该算法的应用则返回
学生答案1为错误答案,因为答案1相对于模板多增加了一个不字,故计算机判定为错误答案;
学生答案2为正确答案,且与标准答案的贴近度为43%;
学生答案3为错误答案,因为答案3相对于模板多增加了一个昨字,故计算机判定为错误答案;
学生答案4为错误答案,因为答案4相对于模板多增加了凉爽这两个字,故计算机判定为错误答案;

显而易见前3个答案计算机做出了准确的判断,但是第4个答案计算机判断错误了。而关键点就在于模板答案的定义上,如果模板答案不能够涵盖所有可能出现的学生答案,那么学生答案只要超出标准答案,则学生答案为错误答案,返回0分。
baobao28 2006-12-28
  • 打赏
  • 举报
回复
针对当前找到的这两个思路,总结出实现难点,贴出来大家参考
ghjvavi 2006-12-28
  • 打赏
  • 举报
回复
mark
ashen926 2006-12-28
  • 打赏
  • 举报
回复
这不是人工智能么,想直接写个简单的字符串处理算法比较麻烦,不光要比较每个字符还得比较每个字符的顺序!
baobao28 2006-12-28
  • 打赏
  • 举报
回复
我打算用这两种思路给客户看,然后告诉他,你的思路在定义模板方面如果完全涵盖所有可能性可以推行
如果应用我的方案,则学生不允许回答与标准答案语气相反的句子,如:标准答案是肯定句则学生答案也是肯定句,不许是否定句
baobao28 2006-12-28
  • 打赏
  • 举报
回复
//标准答案
String str1="今天是个好天气yuio";
//学生答案
String str2="好天气";
//关键词
String[] card=new String[2];
card[0]="今天";
card[1]="好天气";
//card[2]="1+1";
//本题分值
int s0=20;
//关键词在本题中所占得分比重
double p= 0.7;
//学生答案与标准答案的单项贴近度
double t1=0;
//关键词在学生答案中的贴近度
double t2=0;
//最后得分
double s=0;

int length1=str1.length();
Vector v1=new Vector();
int length2=str2.length();
Vector v2=new Vector();

for (int i=0;i<length1;i++)
{
String a=str1.substring(i, i+1);
v1.add(a);
}

for (int i=0;i<length2;i++)
{
String b=str2.substring(i, i+1);
v2.add(b);
}

//计算学生答案与标准答案的单项贴近度
int num=0;
for (int i=0;i<length2;i++)
{
String a=(String)v2.get(i);

if (v1.indexOf(a)>=0)
{
num++;
}
}

t1=(double)num/length1;


//计算关键词在学生答案中的贴近度
int num2=0;

for (int j=0;j<card.length;j++)
{
if (str2.indexOf(card[j])>=0)
{
num2++;
}
}

t2=(double)num2/card.length;

//计算最后得分
s=(p*t2+(1-p)*t1)*s0;
DecimalFormat df = new DecimalFormat("########");
s = Double.parseDouble(df.format(s));
//yingkui=String.valueOf(value);


System.out.println(s);
baobao28 2006-12-28
  • 打赏
  • 举报
回复
嗯,我也是写了个程序来算匹配,我贴出来你看看,另一种思维方案
shine333 2006-12-28
  • 打赏
  • 举报
回复
这个主意不错,不过你可以说,我可以试着帮你弄一个机器评判的匹配度,帮助你们人工判分
sdy3653232 2006-12-28
  • 打赏
  • 举报
回复
例如: 定义 "今天"的值为1
"明天"的值为2 "昨天"的值为-2
"后天"的值为3 "前天"的值为-3
"大"根据后面的词选择 "后天" 为1
"前天" 为-1
"大" 为 大++
int m=0;
读入字符,截止到"是或不是" 进行加减运算 ,如果加起来值不等于1,错误定为-1
所占权为2/6
int n=0;
有效字符 "是或不是" 和字符串比较...,结算"是"之前"不"的值 n
占权为1/6
有效字符 "个" 忽略,必须在"是"后
有效字符 好或坏:0或1+n如果是双数,对 如果是单数 错误定为-1
占权为1/6
有效字符 "天气" 只能出现一次且必须出现,
占权为2/6
最后得出 各有效字符的和

不知道这样理解是否有误


wang_dream 2006-12-28
  • 打赏
  • 举报
回复
"智能"这东西,曾经在世界搞的那么火,都没有什么成就就停止了,对于楼主的问题,我觉得根本找不到解决办法,最起码现在是,将来一定会解决的!
观望中....
加载更多回复(23)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧