本文定义文章的难度系数为:平均句长难度系数+常用字难度系数。
思路:
(1)统计文章中。!?的数量来确定句子数,句子数除以总字符数即为平均句长,即可得到一个测评标准(句长);
(2)保存一个常用500字.txt文档库,用需要判定的文章逐字与常用500字.txt文档进行比较,得到文章的常用字数量,再除以总字符数即可得到另一个测评标准(常用字比例);
(3)设置对应的难度系数。
注:
(本次任务测试了5篇文档,分别是《三体》节选、《小石潭 记》、《荷塘月色》、《西游记》、《南渡北归》。)
其句长和常用字比例计算结果如下图所示。
由上可知:句长大多分布在15~20之间,常用字比例大多占70%左右。
其中句长难度系数的设置为:1星(0,10],2星(10,15],3星(15,23],4星(23,30],5星(30,+无穷)。
常用字难度系数的设置为:1星(0.8,1],2星(0.7,0.8],3星(0.6,0.7],4星(0.4,0.6],5星(0,0.4]。
但是,由于所选样本较少,所以设置难度系数的参数不够准确,后续还需要改进。
常用500字.txt:
代码如下:
//文件名:Diff.java
import java.io.*;
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Diff
{
public static void main(String[] args) throws Exception
{
File file1 = new File(args[0]);//创建一个文件对象
BufferedReader br1=new BufferedReader(new FileReader(file1)); 定义字符读取流
String value1 = null; //定义一个临时接收文件中的字符串变量
String newValue1 =""; //接收文件中所有字符串的变量
int hzcount=0,bdcount=0;
while((value1 = br1.readLine())!= null) //开始读取文件中的字符
{
newValue1 = newValue1 + value1; //把全部字符存入newValue1变量中
//统计句子数
for(int i=0;i<value1.length();i++)
{
String s=Character.toString(value1.charAt(i));//把char型转换成String型
if(s.equals("。")||s.equals("!")||s.equals("?"))
{
bdcount++;
}
}
}
//统计汉字
Pattern p=Pattern.compile("[\\u4e00-\\u9fa5]");//匹配汉字
Matcher m=p.matcher(newValue1);
while(m.find())//统计汉字个数
{
//System.out.println(m.group(0));//输出不带标点的全部汉字
hzcount++;
}
//System.out.println("汉字数:"+hzcount+" 句子数:"+bdcount);
/*1.以句长来定义难度系数*/
double jc=(double)hzcount/(double)bdcount;
//System.out.println("平均句长:"+jc);//输出平均句长
int n1=0;
if(jc>0&&jc<=10)
{
n1=1;
}
else if(jc>10&&jc<=15)
{
n1=2;
}
else if(jc>15&&jc<=23)
{
n1=3;
}
else if(jc>23&&jc<=30)
{
n1=4;
}
else if(jc>30)
{
n1=5;
}
System.out.println("句长难度系数(5星):"+n1+"星");
/*2.以常用字的数量来定义难度系数*/
BufferedReader br2=new BufferedReader(new FileReader("常用500字.txt")); 定义字符读取流,读取“常用500字.txt”
String value2 = null; //定义一个临时接收文件中的字符串变量
String newValue2 =""; //接收文件中所有字符串的变量
while((value2 = br2.readLine())!= null) //开始读取文件中的字符
{
newValue2 = newValue2 + value2; //存入newValue2变量中
}
int cycount=0;
for(int i=0;i<newValue1.length();i++)//统计读取文章常用字的个数
{
for(int j=0;j<newValue2.length();j++)//文章中的汉字逐个与常用字库进行对比
{
if((newValue1.charAt(i))==(newValue2.charAt(j)))//如果相同则计数
{
cycount++;
}
}
}
double cyz=(double)cycount/(double)hzcount;//难度系数n2=文章中常用字数除以文章总字数
int n2=0;
if(cyz>0&&cyz<=0.4)
{
n2=5;
}
else if(cyz>0.4&&cyz<=0.6)
{
n2=4;
}
else if(cyz>0.6&&cyz<=0.7)
{
n2=3;
}
else if(cyz>0.7&&cyz<=0.8)
{
n2=2;
}
else if(cyz>0.8)
{
n2=1;
}
//System.out.println("常用字比例:"+cyz);//输出常用字比例
System.out.println("常用字难度系数(5星):"+n2+"星");
System.out.println(file1+" 的难度系数为:"+(n1+n2)+"星");
}
}
结果如下: