中文文本匹配算法的实现
用 Java 编写了这个算法
原因是 最近在做一个学习软件,需要检测语言输入结果的检测率。我查了百度没找到一个轻量级的 中文 文本匹配算法,因此亲自编写了这个程序。
如何插入一段漂亮的代码片
代码片
/**
* @author nrxsh
* @url https://blog.csdn.net/qq_16635277
* @date 2:52 2019/4/30
* 大家早点休息吧
*/
package space.nrxsh.cntxtmtc;
public class ChineseStringMatcher {
/**
*
*/
public static final char MATCH = '十';
public static final char MISMATCH = '口';
/**
*
*/
private static final char[] cnSignArr = "。?!,、;:“” ‘’「」『』()〔〕【】—﹏…~·《》〈〉".toCharArray();
private static final char[] enSignArr = "`!@#$%^&*()_+~-=[]\\;',./{}|:\"<>?".toCharArray();
/**
*
*/
private String originString;
private String matchString;
private String orgWords;
private String mtcWords;
/**
*
*/
private char[] org;
private char[] mtc;
/**
*
*/
private int[] indicator;
/**
*
*/
private double matchingRate;
private double accuracyRate;
private int absent;
private int excess;
public ChineseStringMatcher(String orignText, String matchText) {
super();
this.originString = orignText;
this.matchString = matchText;
//init variables
initVariables();
//do process
doProcess();
}
private void initVariables() {
//init char array
orgWords = clearNonWordChar(originString);
mtcWords = clearNonWordChar(matchString);
org = orgWords.toCharArray();
mtc = mtcWords.toCharArray();
//init indicator
int i=0;
indicator = new int[mtc.length]; // init with 0
}
public int[] getIndicator() {
return indicator;
}
public double getMatchingRate() {
return matchingRate;
}
public double getAccuracyRate()
{
return accuracyRate;
}
public int getAbsent() {
return absent;
}
public int getExcess() {
return excess;
}
public String getOriginString() {
return originString;
}
public String getMatchString() {
return matchString;
}
public char[] getOrg() {
return org;
}
public char[] getMtc() {
return mtc;
}
private String clearNonWordChar(String str)
{
for(int i=0;i<cnSignArr.length;i++)
str = str.replace(""+cnSignArr[i], "");
for(int i=0;i<enSignArr.length;i++)
str = str.replace(""+enSignArr[i], "");
return str;
}
public void doProcess()
{
int index = 0;
double matchCount = 0;
for(int i=0;i<mtc.length;i++)
{
for (int j = index; j < org.length; j++)
{
if(mtc[i] == org[j])
{
index++;
indicator[i] = 1;
matchCount++;
break;
}
}
}
matchingRate = matchCount/orgWords.length()*100;
accuracyRate = matchingRate * matchCount / mtcWords.length();
if(orgWords.length() > matchCount)
absent = orgWords.length() - (int)matchCount;
if(mtcWords.length() - (int)matchCount != 0)
excess = mtcWords.length() - (int)matchCount;
}
public void printResult()
{
System.out.println(" - - - - Start - - - - ");
System.out.printf("%-8s%8s\n","原串:",originString);
System.out.printf("%-8s%8s\n","目标串:",matchString);
System.out.println();
System.out.printf("%-16s\n","匹配结果:"
+ "");
for(int i=0;i<mtc.length;i++)
{
System.out.printf("%2c",mtc[i]);
}
System.out.println();
for(int i:indicator)
{
System.out.printf("%2c",indicator[i]==0?MATCH:MISMATCH);
}
System.out.println();
System.out.printf("匹配率:%.2f%%\n",matchingRate);
System.out.printf("准确率:%.2f%%\n",accuracyRate);
System.out.println();
if(absent != 0)
System.out.printf("\n比原串少%d个字\n",absent);
if(excess != 0)
System.out.printf("\n比原串多%d个字\n",excess);
System.out.println(" - - - - Start - - - - ");
}
public static void main(String[] arg)
{
System.out.println("hello world!");
ChineseStringMatcher matcher =
new ChineseStringMatcher("我们爱国", "我热爱祖国");
matcher.printResult();
new ChineseStringMatcher("今天是星期五", "今天星期四").printResult();
new ChineseStringMatcher("博客园科技发展(北京)有限公司", "博客园科技发展有限公司").printResult();
new ChineseStringMatcher("我热爱祖国,热爱计算机科学", "我热爱计算机科学").printResult();
}
}
输出
hello world!
- - - - Start - - - -
原串: 我们爱国
目标串: 我热爱祖国
匹配结果:
我 热 爱 祖 国
十 口 十 口 十
匹配率:75.00%
准确率:45.00%
比原串少1个字
比原串多2个字
- - - - Start - - - -
- - - - Start - - - -
原串: 今天是星期五
目标串: 今天星期四
匹配结果:
今 天 星 期 四
口 口 口 口 口
匹配率:66.67%
准确率:53.33%
比原串少2个字
比原串多1个字
- - - - Start - - - -
- - - - Start - - - -
原串: 博客园科技发展(北京)有限公司
目标串: 博客园科技发展有限公司
匹配结果:
博 客 园 科 技 发 展 有 限 公 司
口 口 口 口 口 口 口 口 口 口 口
匹配率:84.62%
准确率:84.62%
比原串少2个字
- - - - Start - - - -
- - - - Start - - - -
原串: 我热爱祖国,热爱计算机科学
目标串: 我热爱计算机科学
匹配结果:
我 热 爱 计 算 机 科 学
口 口 口 口 口 口 口 口
匹配率:66.67%
准确率:66.67%
比原串少4个字
- - - - Start - - - -
最后
晚安!