词素匹配:一个实现

简介 基本上的词素匹配就是一些将这个问题转化为数学数值匹配问题,这里就是转化为相关矩阵的运算。

这里用到的是长度匹配(得加上统计规律)

比如:我是一个不善于交际的男孩 1

           我是一个男孩 2

           我是男孩 3

这几句是近似的

package abrupt.test;

import java.util.Scanner;

/*
 * 时间:2019 12 8
 * 作者:latefly
 * 功能:
 * 实现一个基本的词素匹配思路
 * 
 * 假设输入两个句子
 * 
 * I am a boy
 * I am a beautiful boy
 * 
 * 怎样去匹配呢(假设连标点都算上)
 * 1表示匹配
 * 0表示不匹配(中间有省略部分)
 * 	I am a beautiful boy
 * I1
 *   1
 * a  1
 * m   1
 *      1
 * a     1
 *        1
 * b       1
 * o        0
 * y         0
 * 假设我们只关注主对角线的话会出现这种状况
 * 但是我们关注斜对角线的时候就会有别的发现
 * 这里就是探讨这个问题
 * 
 * 下面我们探讨匹配的思路
 * 当一个字匹配时匹配位置是1
 * 不匹配时匹配位置填写两个字符距离的绝对值
 * 
 * 怎样算匹配呢
 * 计算自身与自身的匹配值K1(所有匹配位置相)
 * 计算与要匹配的匹配值 K2
 * 然后这两差值的绝对值|K1-K2|比上K1计算的值便为匹配的相似值(这个值越小表示越接近)
 * 
 * 
 * 
 * 
 * 
 * */
public class PharsePair {
	static char input1[];//
	static char input2[];

	public static void main(String[] args) {
		while (true) {
			compare();
		}
	}

	static void compare() {
		// 要匹配的对象
		String input = "I am a boy";
		input1 = input.toCharArray();

		// 创建输入
		Scanner sc = new Scanner(System.in);
		System.out.println("input1:I am a boy");
		System.out.println("Please input something to begain this test!");
		String in = sc.next();
		input2 = in.toCharArray();

		// 创建自身匹配数组
		int selfPair[][] = new int[input1.length][input1.length];
		// 进行自身匹配
		for (int i = 0; i < selfPair.length; i++) {
			char temp = input1[i];
			for (int j = 0; j < selfPair[0].length; j++) {
				selfPair[i][j] = Math.abs(input1[j] - temp);
			}
		}
		// System.out.println("selfPair:");
		// showMatrix(selfPair);

		int compareMatrix[][] = new int[input1.length][input2.length];
		// 进行两个语句的匹配
		for (int i = 0; i < input1.length; i++) {
			char temp = input1[i];
			for (int j = 0; j < input2.length; j++) {
				compareMatrix[i][j] = Math.abs(input2[j] - temp);
			}
		}
		// System.out.println("compareMatrix:");
		showMatrix(compareMatrix);

		int K1 = 0, K2 = 0;

		for (int i = 0; i < input1.length; i++) {
			for (int j = 0; j < input1.length; j++) {
				K1 += selfPair[i][j];
			}
		}

		for (int i = 0; i < input1.length; i++) {
			for (int j = 0; j < input2.length; j++) {
				K2 += compareMatrix[i][j];
			}
		}

		double delt = (double) (Math.abs(K1 - K2) * 1.0 / K1);
		// delt = 1.0 - delt;
		System.out.println("K1:" + K1 + "  K2:" + K2);
		System.out.println("likely:" + delt);
	}

	static void showMatrix(int arr[][]) {
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[0].length; j++) {
				System.out.printf("%4d  ", arr[i][j]);
			}
			System.out.println();
		}
	}

}

整个的匹配结果

第一个矩阵是自身相关的矩阵

第二个矩阵是匹配矩阵


image.png



这里处理比较粗糙的地方只是将矩阵的各个值相加求差然后相除

这里的问题是要匹配的字符串与输入的字符串长度相差过大时会出现大于1的情况

但是两个语句的相似性确实是可以在匹配矩阵中体现的。

文章评论

Top