基于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
- 基于k-gram的拼写校正方法的实现
- 《基于相似度分析的拼写校正器》
- 基于Skip-Gram的Word2Vec神经网络实现
- 基于K-gram的winnowing特征提取剽窃查重检测技术(概念篇)
- Gram-Schmidt正交化及其修正方法的matlab实现
- 基于opencv的简单亮度校正功能实现
- Python + OpenCV实现基于傅里叶变换的旋转文本校正
- OpenCV实现基于傅里叶变换的旋转文本校正
- OpenCV实现基于傅里叶变换的旋转文本校正
- 基于贝叶斯算法的拼写检查器
- 有关笔记本电池校正的方法
- 基于词表和N-gram算法的新词识别实验
- 基于词表和N-gram算法的新词识别实验
- 基于统计的N-gram模型命名实体识别
- 基于N-gram的双向最大匹配中文分词
- 基于N-gram的双向最大匹配中文分词
- [DL]基于Pytorch的N-gram Language Model
- 基于对论文Content Importance Models for Scoring Writing From Sources的简单的1-gram的实现
- 规划局规划局很关键的方风格和风格化风格和风格化
- InstallAnywhere web打包成exe文件(tomcat6 , mysql。jdk1.6)
- 家和国家各环节的风格的风格的发给的非官方大哥
- 线性表的操作
- 针对TCP连接异常断开的分析
- 基于k-gram的拼写校正方法的实现
- 冒泡排序原理以及算法
- 几个环节个环境规划就规划的风格的风格大方电饭锅电饭锅梵蒂冈
- 写socket网络通讯Agenda时遇到的几个坑
- 规划局规划局很关键非官方规划方大哥大法官豆腐干豆腐
- VisionEngine游戏对象中装饰组介绍
- java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for
- 个几个环节个环境规划就规划局规划局个环境规划
- 通过一道贪心学到了优先队列的用法