中文文本匹配算法的实现(Java)

用 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 - - - - 

最后

晚安!

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值