英语语法检查工具C++
英语语法检查工具,主要检查英语中语谓一致,如第三人称,非第三人称,情态动词,如:should can may must,和there be等.
用句法分析工具首先词形标注,其实句法分析,结果如:(TOP (S (NP (PRP$ my) (NN name) ) (VP (VBP are) (NP (NNS tom) ) ) ) )
求高手帮小弟解决此程序
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
//function declaration
int evaluate(string line);
vector<string> sepString(string str);
int countWrong(vector<string> &abstract,int pos,int loc);
int findMaxNP(vector <string> &abstract,int pos);
int evaluate(string line)
{
int num = 0;
//string line;
vector <string> abstract;
int k = 4;//for can may ?
int M=0; //for may can ?
int canWrong = 0;
int VBZWrong = 0;
int VBPWrong = 0;
int articleWrong = 0;
int VBZ = 0;
int VBP = 0;
int article = 0;//record num of the whole abstract记录全部抽象数
num++;
if(line == "")
{
cout<<"句子为空"<<endl;
//continue;
}
// outFile<<"wrong of the abstract number:"<<num<<endl;
abstract = sepString(line);//调用向量函数
for(int i = 0; i < abstract.size();i++)
{
M = 0;//init
if(abstract[i] =="(VBZ"){VBZ++;}
if(abstract[i] =="(VBP"){VBP++;}
if(abstract[i] =="(DT"){article++;}
if(abstract[i] == "can)" || abstract[i] == "may)")//用规则判断类拟的情态动情后面是否是原型
{
for(int j = 1;j < k;j++)
{
if(i+j < abstract.size())
{
if(abstract[i+j] != "(VB" && abstract[i+j] != "(RB")
{
M++;
}
else
{
break;
}
}
}
if(M == 6)
{
canWrong++;
}
}
else if(abstract[i] == "(VBZ" || abstract[i] == "(VBP")
{
int locationMaxNP = 0;
int wrongFlag = 0;
locationMaxNP = findMaxNP(abstract,i);//
if(locationMaxNP != -1 && locationMaxNP != -2)
{
if(abstract[locationMaxNP] == "(NP")
{
wrongFlag = countWrong(abstract,locationMaxNP,i);
if(wrongFlag == 1)
{
VBZWrong++;
}
if(wrongFlag == 2)
{
VBPWrong++;
}
if(wrongFlag == 3)
{
articleWrong++;
}
if(wrongFlag == 4)
{
VBZWrong++;
articleWrong++;
}
if(wrongFlag == 5)
{
VBPWrong++;
articleWrong++;
}
}
else//to do next
{
if(abstract[locationMaxNP] == "(ADVP")
{
locationMaxNP = findMaxNP(abstract,locationMaxNP);
if(locationMaxNP != -1 && locationMaxNP != -2)
{
if(abstract[locationMaxNP] == "(NP")
{
wrongFlag = countWrong(abstract,locationMaxNP,i);
//
if(wrongFlag == 1)
{
VBZWrong++;
}
if(wrongFlag == 2)
{
VBPWrong++;
}
if(wrongFlag == 3)
{
articleWrong++;
}
if(wrongFlag == 4)
{
VBZWrong++;
articleWrong++;
}
if(wrongFlag == 5)
{
VBPWrong++;
articleWrong++;
}
}
else
{
continue;
}
}
else
{
continue;
}
}
else
{
continue;
//maybe wrong of the parser
}
}
}
else
{
continue;
}
}
}
//outFile<<endl;
// outFile<<"wrong of the abstract number:"<<num<<endl;
cout<<"VBZWrong:"<<VBZWrong<<endl;
cout<<"VBPWrong:"<<VBPWrong<<endl;
cout<<"articleWrong:"<<articleWrong<<endl;
cout<<"canWrong:"<<canWrong<<endl;
cout<<"VBZ"<<VBZ<<" "<<"VBP"<<VBP<<" "<<"article"<<article<<endl;
return 1;
}
int countWrong(vector<string> &abstract,int pos,int loc)
{
int sum = 0;
int num = 0;
int article = 0;
while(abstract[pos] == "(NP")
{
pos++;
}
article = pos;
num = 1;
bool flag = 0;
bool flag1 = 0;
bool flag2 = 0;
int NNSpos = 0;
int andpos = 0;
while(num != 0)
{
if(abstract[pos].find(")") != -1)
{
num--;
}
if(abstract[pos].find("(") != -1)
{
num++;
}
if(abstract[pos] == "(NNS" )//&& abstract[loc] == "(VBZ")
{
flag = 1;
NNSpos = pos;
}
if(abstract[pos] == "(PRP" || abstract[pos] == "(PRP$")
{
flag1 = 1;
}
if(abstract[pos] == "and)" )
{
int pos1 = pos - 2;
int m = 0;
while(abstract[pos1 - m].find("(") == -1)
{
m++;
}
if(abstract[pos1 - m].find("NN") != -1)
{
flag2 = 1;//and connect two NN,we use VBP directly
andpos = pos;
}
}
pos++;
}
if(flag == 1 && abstract[loc] == "(VBZ")
{
sum+=1;//VBZWrong;
cout<<"location "<<NNSpos<<" have "<<abstract[NNSpos]<<"----"<<abstract[loc]
<<endl;
}
if(flag == 0)
{
if(flag2 == 1)
{
if(abstract[loc] == "(VBZ")
{
cout<<"location "<<andpos<<" have "<<abstract[andpos]<<"----"<<loc<<"
"<<abstract[loc+1]<<" "<<abstract[loc+2]<<endl;
sum += 1;//VBZWrong
}
}
else
{
bool flag3 = 0;
while(pos < loc)
{
if(abstract[pos] == "and)")
{
flag3 = 1;
andpos = pos;
break;
}
pos++;
}
if(flag3 == 1 && abstract[loc] == "(VBZ")
{
cout<<"location "<<andpos<<"have "<<abstract[pos]<<"----"<<loc<<"
"<<abstract[loc+1]<<" "<<abstract[loc+2]<<endl;
sum += 1;//VBZWrong
}
else if(flag3 == 0 && abstract[loc] == "(VBP")
{
cout<<"have no [and] [NNS] "<<"-----"<<loc<<" "<<abstract[loc+1]<<"
"<<abstract[loc+2]<<endl;
sum += 2;//VBPWrong
}
}
}
if(flag1 != 1 && abstract[article] != "(DT" && abstract[article] != "(CD")
{
cout<<"NP have no DT"<<endl;
sum += 3;//article wrong
}
return sum;
}
//找最长的NP
int findMaxNP(vector <string> &abstract,int pos)
{
int start=0;
while(pos >= 0 && abstract[pos].find(")") == -1)// -1 right?
{
pos--;
}
if(pos == 0)
{
return -1;//the VBZ||VBP is the first word in the abstract
}
else
{
start = 1;
pos--;
while(pos >= 0 && start != 0)
{
if(abstract[pos].find("(") != -1)
{
start--;
}
else if (abstract[pos].find(")") != -1)
{
start++;
}
pos--;
}
if(start == 0)
{
pos++;
return pos;
}
else
{
return -2;//( and ) not match
}
}
}
//字符串以空格分开,放到向量里面
vector<string> sepString(string str)
{
istringstream in(str);
vector<string> temp;
string word;
while(!in.eof())
{
in>>word;
if(word != "")
{
temp.push_back(word);
}
else
{
cout<<"separate string wrong"<<endl;
}
}
return temp;
}
int main()
{
string s;
// s="(TOP (S (NP (EX there) ) (VP (VBZ is) (NP (NP (DT a) (NN book) ) (PP (IN on) (NP
(DT the) (NN desk) ) ) ) ) (. .) ) ) ";
// s="(TOP (S (NP (PRP he) ) (VP (MD can) (VP (VB speak) (VP (VB english) ) ) ) ) )";
s="(TOP (S (NP (PRP$ my) (NN name) ) (VP (VBP are) (NP (NNS tom) ) ) ) )";
evaluate(s);
return 1;
}
NP:名词短语
VP:动词短语
PP:介词短语
CC:并列连词
CD:基数
DT:限定词
EX:存在
FW:外来词
IN:前置/从属连词
JJ:形容词
JJR:形容词比较级
JJS:形容词最高级
LS:列表符号
MD:情态
NN:一个或多个名词
NN:U:物资名词
NN:UN:可作为物资名词的名词
NNP:专有名词 单数
NNPS:专有名词复数
NNS:名词复数
PDT:前限定词
PRP:人称代词
PRP$:所有格代词
RB:副词
RBR:副词比较级
RBS:副词最高极
RP:语气词
SYM:符号
TO: to
UH:感叹词
VB:动词原型
VBD:动词过去时
VBG:动词现在分词
VBN:动词过去分词
VBP:动词 非第三人称
VBZ:动词 第三人称
WDT: wh- 限定词
WP: wh- 代名词
WP$: wh- 代名词所有格
WRB: wh- 副词
http://topic.csdn.net/u/20080429/15/0214cf94-cfa2-49d4-bcb9-a06ca2715c0f.html#top
英语语法检查工具C++相关推荐
- 英语语法检查工具Grammarly安装使用指南(20200415)
目录 Grammarly是什么 注册Grammarly账号 安装Grammarly for Windows 在浏览器上安装Grammarly扩展程序(插件) 在Microsoft Edge浏览器上安装 ...
- 工具说明书 - 英语语法检查工具Grammarly
在使用Word和Outlook输入英文时,如果输入不正确的英文单词,微软Office内置的词典,就会帮忙检查拼写错误. 可以下载一个软件Grammarly,然后注册个账号,使用免费版的即可.我使用的是 ...
- 英语在线单词、语法检查工具
英语在线单词.语法检查工具 在线英语单词拼写检查工具 http://plagiarisma.net/cn/spellcheck.php https://www.nounplus.net/ https: ...
- 英语语法检查,改写,翻译和总结神器:wordvce AI
Wordvice AI是一款英语语法检查和纠错工具,可用于帮助英语学习者和非母语使用者检查和改进英语写作技能.它使用人工智能和自然语言处理技术来自动识别和纠正语法错误.拼写错误.标点符号问题和其他常见 ...
- vue语法检查工具eslint报错小记(error Unexpected trailing comma、Extra semicolon、error ‘loadingInstance‘ is nev)
vue语法检查工具eslint报错小记 vue项目开发中开启语法检查工具eslint,尤其是接手别人的代码继续开发时,如果不注意语法习惯,项目运行时会出现一堆warning.error,乍一看就头大, ...
- php语法检查工具------http //www trisunsoft com/free-web-tools-onli
最近写了点php代码,改动不小(主要是字符串替换), 我当时就担心, 要是出了语法问题, 多了或者少了一个符号, 那就呵呵哒了. 果不其然, 一放到机器上运行, 页面就打不开, 这肯定是语法出问题了. ...
- vs2008下的javascript语法检查工具——JSLint.VS
之前一直用Jslint网站帮助检查javascript语法. 不过不是太方便.后来发现jslint.vs,一个vs2008/vs2005的插件.效果很好,借用一下官网的图片如下. 安装十分简单: 1) ...
- linux bash语法检查,ShellCheck — Shell Script 语法检查工具
如果在使用一些指令 (例如 rm) 不小心, ShellCheck 是一个 Shell Script 分析及除错工具, 之后要花很多时间修复, 可以在尝试执行 Shell Script 前先找出 Wa ...
- 如何在vuejs里禁用eslint语法检查工具
eslint好是好,可要求很苛刻,对于我这种写代码很糙的媛...... 搜索的时候有的说加入 /* eslint-disabled */(有用,但只是部分代码享受此待遇) 还有说删除.eslintrc ...
最新文章
- Proxy代理 和 Reflect反射(反射的是obj)的概念
- C++main函数的参数介绍以及如何在main函数前执行一段代码
- windows 2008 r2 系统默认80端口被系统占用的处理
- Smokeping的参数使用说明
- apache服务器性能不行,Apache服务器性能调优
- 如何使用JavaScript从字符串中删除空格?
- Mapreduce概念及流程介绍
- 计算机辅助设计(湖南省首届“湘邮科技杯”大学生程序设计大赛试题)
- Ubuntu命令方式安装中文语言包
- android9 apk自动安装功能,Android自动安装APK
- Windows Git 上传 报错 error: bad signature 0x00000000 fatal: index file corrupt
- 论文阅读笔记------摄影测量与深度学习
- JS实现tic tac toe
- 微信-H5界面跳转至公众号关注界面问题
- centos 8 的图形操作界面在哪_【行测备考】立体图形截面有哪些实用技法?
- bigDecimal除法取整数
- 中台不同于平台,那么到底啥是中台?
- 计算机与通信网络潘书文答案,计算机与通信网络潘书文答案
- 创业撸Java多年,老王准备换50万的车了
- zip分卷压缩与合并解压
热门文章
- 大型企业如何搭建企业邮箱系统?
- 如何更改计算机睿频,笔记本电脑如何关闭睿频功能来降低CPU温度
- md5 16位加密 java_MD5加密,MD5在线加密,MD5校验
- R语言计量:Newey-West调整
- 关于飞思卡尔S12系列单片机SPI通信MODRR配置
- 高强度文件夹加密大师破解版
- 关于颁布总承包服务费标准的通知
- 四:Jenkins日程表配置说明
- RDKit | 化合物SDF文件转换为SMILES存储为CSV
- 八一农垦大学计算机科学与技术专业好不好,黑龙江八一农垦大学最好的专业(什么专业最好)...