基于k-gram的拼写校正方法的实现

来源:互联网 发布:超图软件目标价 编辑:程序博客网 时间:2024/05/17 07:46

Xiaohui Huang, hxh1994@foxmail.com
China University of Geosciences, Wuhan , 430074
School of Computer. Network Engineering


基于k-gram的拼写校正方法的实现


一、k-gram拼写校正方法简介

k-gram拼写校正方法是《信息检索导论》中提到的两种主要的拼写校正方法之一(另一种主要的拼写校正方法为基于编辑距离的拼写校正方法),核心思想是通过求Jaccard系数,通过比较Jaccard系数与预先定义的阈值进行相关的比较。

其中,Jaccard系数的计算公式为:



其中,A、B为两个单词,长度分别为m和n,那么单词A和B的k-gram词项集合中的词项数分别为m+1-k和n+1-k个。

其中,分子AB表示单词A和B的k-gram词项集合中相同的词项个数。分母的A表示单词A的k-gram词项集合中的词项数,B表示单词B的k-gram词项集合的词项数。

算出Jaccard后,与预先定义的阈值做比较,留下Jaccard系数大于阈值的单词。


二、Jaccard系数计算实例

假设有一词项集合


查询关键词为bord;k取2,阈值为0.35,那么查询关键词bord的2-gram词项集合为A={bo,or,rd};(3个)

对于任意一单词border,其2-gram词项集合为B={bo,or,rd,de,er};(5个)

其中集合A和集合B的交集为{bo,or,rd};(3个)

      那么单词border的Jaccard系数为



0.8>0.35,满足条件。


三、代码实现

代码实现环境为Visual C++ 6.0,文件名字为k-gram_Search.cpp
#include<iostream>#include<string>#include<fstream>using namespace std;//字符数目为n的词项k-gram数目为n+1-k//预定的阈值为0.1#define threshold 0.1//阈值void k_gram(string words,string kwords,int _k){string input="";//输入的字符串string search="";//要查询的字符串int k=0;//k-gram中的k值int input_k_gram=0;//输入字符串的k-gram数目int search_k_gram=0;//查询关键字的k-gram数目int fitness=0;//匹配度float Jaccard=0.00;//Jaccard系数//初始化相应的值//cout<<"请输入要查询的字符:";//cin>>input;input=words;//cout<<"请输入查询关键字:";//cin>>search;search=kwords;//cout<<"请输入k-gram中的k值:";//cin>>k;k=_k;//计算k-gram数目input_k_gram=input.size()+1-k;search_k_gram=search.size()+1-k;cout<<input_k_gram<<"    "<<search_k_gram<<endl;for(int i=0;i<search.size()-1;i++){string temp=search.substr(i,k);string::size_type pos=input.find(temp);if(pos<input.size()) fitness++;}cout<<"fitness="<<fitness<<endl;//计算Jaccard系数Jaccard=(float)fitness/(input_k_gram+search_k_gram-fitness);cout<<Jaccard<<endl;if(Jaccard>threshold) cout<<input<<endl;cout<<endl;}void main(){//初始化部分cout<<"请输入查询关键字:";string kwords;cin>>kwords;cout<<"请输入k值:";int k;cin>>k;string str;ifstream out("F:\\大三下课程\\网络存储\\课程实习\\words.txt",ios::in);while(!out.eof()){getline(out,str);//cout<<str<<endl;k_gram(str,kwords,k);}out.close();}

其中,此处单词集合我是用文本的形式存储的,每一行存储一个单词
也可以用单链表实现单词集合的存储。


1 0
原创粉丝点击