英语语法检查工具,主要检查英语中语谓一致,如第三人称,非第三人称,情态动词,如: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++相关推荐

  1. 英语语法检查工具Grammarly安装使用指南(20200415)

    目录 Grammarly是什么 注册Grammarly账号 安装Grammarly for Windows 在浏览器上安装Grammarly扩展程序(插件) 在Microsoft Edge浏览器上安装 ...

  2. 工具说明书 - 英语语法检查工具Grammarly

    在使用Word和Outlook输入英文时,如果输入不正确的英文单词,微软Office内置的词典,就会帮忙检查拼写错误. 可以下载一个软件Grammarly,然后注册个账号,使用免费版的即可.我使用的是 ...

  3. 英语在线单词、语法检查工具

    英语在线单词.语法检查工具 在线英语单词拼写检查工具 http://plagiarisma.net/cn/spellcheck.php https://www.nounplus.net/ https: ...

  4. 英语语法检查,改写,翻译和总结神器:wordvce AI

    Wordvice AI是一款英语语法检查和纠错工具,可用于帮助英语学习者和非母语使用者检查和改进英语写作技能.它使用人工智能和自然语言处理技术来自动识别和纠正语法错误.拼写错误.标点符号问题和其他常见 ...

  5. vue语法检查工具eslint报错小记(error Unexpected trailing comma、Extra semicolon、error ‘loadingInstance‘ is nev)

    vue语法检查工具eslint报错小记 vue项目开发中开启语法检查工具eslint,尤其是接手别人的代码继续开发时,如果不注意语法习惯,项目运行时会出现一堆warning.error,乍一看就头大, ...

  6. php语法检查工具------http //www trisunsoft com/free-web-tools-onli

    最近写了点php代码,改动不小(主要是字符串替换), 我当时就担心, 要是出了语法问题, 多了或者少了一个符号, 那就呵呵哒了. 果不其然, 一放到机器上运行, 页面就打不开, 这肯定是语法出问题了. ...

  7. vs2008下的javascript语法检查工具——JSLint.VS

    之前一直用Jslint网站帮助检查javascript语法. 不过不是太方便.后来发现jslint.vs,一个vs2008/vs2005的插件.效果很好,借用一下官网的图片如下. 安装十分简单: 1) ...

  8. linux bash语法检查,ShellCheck — Shell Script 语法检查工具

    如果在使用一些指令 (例如 rm) 不小心, ShellCheck 是一个 Shell Script 分析及除错工具, 之后要花很多时间修复, 可以在尝试执行 Shell Script 前先找出 Wa ...

  9. 如何在vuejs里禁用eslint语法检查工具

    eslint好是好,可要求很苛刻,对于我这种写代码很糙的媛...... 搜索的时候有的说加入 /* eslint-disabled */(有用,但只是部分代码享受此待遇) 还有说删除.eslintrc ...

最新文章

  1. Proxy代理 和 Reflect反射(反射的是obj)的概念
  2. C++main函数的参数介绍以及如何在main函数前执行一段代码
  3. windows 2008 r2 系统默认80端口被系统占用的处理
  4. Smokeping的参数使用说明
  5. apache服务器性能不行,Apache服务器性能调优
  6. 如何使用JavaScript从字符串中删除空格?
  7. Mapreduce概念及流程介绍
  8. 计算机辅助设计(湖南省首届“湘邮科技杯”大学生程序设计大赛试题)
  9. Ubuntu命令方式安装中文语言包
  10. android9 apk自动安装功能,Android自动安装APK
  11. Windows Git 上传 报错 error: bad signature 0x00000000 fatal: index file corrupt
  12. 论文阅读笔记------摄影测量与深度学习
  13. JS实现tic tac toe
  14. 微信-H5界面跳转至公众号关注界面问题
  15. centos 8 的图形操作界面在哪_【行测备考】立体图形截面有哪些实用技法?
  16. bigDecimal除法取整数
  17. 中台不同于平台,那么到底啥是中台?
  18. 计算机与通信网络潘书文答案,计算机与通信网络潘书文答案
  19. 创业撸Java多年,老王准备换50万的车了
  20. zip分卷压缩与合并解压

热门文章

  1. 大型企业如何搭建企业邮箱系统?
  2. 如何更改计算机睿频,笔记本电脑如何关闭睿频功能来降低CPU温度
  3. md5 16位加密 java_MD5加密,MD5在线加密,MD5校验
  4. R语言计量:Newey-West调整
  5. 关于飞思卡尔S12系列单片机SPI通信MODRR配置
  6. 高强度文件夹加密大师破解版
  7. 关于颁布总承包服务费标准的通知
  8. 四:Jenkins日程表配置说明
  9. RDKit | 化合物SDF文件转换为SMILES存储为CSV
  10. 八一农垦大学计算机科学与技术专业好不好,黑龙江八一农垦大学最好的专业(什么专业最好)...