中文词法分析的简单程序

2024-04-14 14:08

本文主要是介绍中文词法分析的简单程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VC 6.0 下编译通过  disc 为辞典   expression 为输入的短语

 

// Code.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "string.h"
#include "windows.h"

int CountWord(char* words);  //计 算有多少个字符

struct dict
{
 char syn[8],word[6];
 int scode,wcode;
} dic[19];

int main(int argc, char* argv[])
{
 strcpy(dic[0].syn,"祈使动词");
    dic[0].scode=0;
 strcpy(dic[0].word,"请");
    dic[0].wcode=0;
    strcpy(dic[1].syn,"祈使动词");
    dic[1].scode=0;
 strcpy(dic[1].word,"把");
    dic[1].wcode=1;
    strcpy(dic[2].syn,"代词");
 dic[2].scode=1;
 strcpy(dic[2].word,"你");
 dic[2].wcode=0;
 strcpy(dic[3].syn,"动词");
 dic[3].scode=2;
 strcpy(dic[3].word,"走");
 dic[3].wcode=0;
 strcpy(dic[4].syn,"动词");
 dic[4].scode=2;
 strcpy(dic[4].word,"跑");
 dic[4].wcode=1;
 strcpy(dic[5].syn,"动词");
 dic[5].scode=2;
 strcpy(dic[5].word,"跳");
 dic[5].wcode=2;
 strcpy(dic[6].syn,"动词");
 dic[6].scode=2;
 strcpy(dic[6].word,"转");
 dic[6].wcode=3;
 strcpy(dic[7].syn,"动词");
 dic[7].scode=2;
 strcpy(dic[7].word,"抬");
 dic[7].wcode=4;
 strcpy(dic[8].syn,"方向词");
 dic[8].scode=3;
 strcpy(dic[8].word,"向左");
 dic[8].wcode=0;
 strcpy(dic[9].syn,"方向词");
 dic[9].scode=3;
 strcpy(dic[9].word,"向右");
 dic[9].wcode=1;
 strcpy(dic[10].syn,"方位词");
 dic[10].scode=4;
 strcpy(dic[10].word,"向前");
 dic[10].wcode=0;
 strcpy(dic[11].syn,"方位词");
 dic[11].scode=4;
 strcpy(dic[11].word,"侧");
 dic[11].wcode=1;
 strcpy(dic[12].syn,"名词");
 dic[12].scode=5;
 strcpy(dic[12].word,"左手");
 dic[12].wcode=0;
 strcpy(dic[13].syn,"名词");
 dic[13].scode=5;
 strcpy(dic[13].word,"右手");
 dic[13].wcode=1;
 strcpy(dic[14].syn,"名词");
 dic[14].scode=5;
 strcpy(dic[14].word,"左腿");
 dic[14].wcode=2;
 strcpy(dic[15].syn,"名词");
 dic[15].scode=5;
 strcpy(dic[15].word,"右腿");
 dic[15].wcode=3;
 strcpy(dic[16].syn,"副词");
 dic[16].scode=6;
 strcpy(dic[16].word,"快");
 dic[16].wcode=0;
 strcpy(dic[17].syn,"副词");
 dic[17].scode=6;
 strcpy(dic[17].word,"慢");
 dic[17].wcode=1;
 strcpy(dic[18].syn,"其他词");
 dic[18].scode=7;
 strcpy(dic[18].word,"起来");
 dic[18].wcode=0;
//--Init Data End
///

 char expression[30],phrase[40];  //输 入句子的分词程序
 char *p1,*p2;      //*
 PWORD pw_exp1,pw_exp2,pw_old;   //temp   pw_old Can RollBack
 int  n_WordNub = 0,n_InputNub = 0;   //*
 
 strcpy(expression,"请你向前走快抬左手侧左腿");
 
 for(int i=0; i<40; i++)
  phrase[i] = ' ' ;
 phrase[39] = '/0';

 p2 = expression;
 p1 = phrase;
  pw_old = pw_exp1 = (PWORD)p2;  //Init

//计 算输入的字数以确定查询的次数
 n_InputNub = CountWord(p2);
 
    printf("分析结果: /n");

    for(int nub=0; nub<n_InputNub; nub++) //按 照输入的字数来找
 {
  for(int i=0; i<19; i++)  // 查询词表
  {
   pw_exp2 = (PWORD)dic[i].word;
   for(int j=0; j<CountWord(dic[i].word); j++) //比 较单词
   {
    if (*pw_exp1 == *pw_exp2)
    {
     pw_exp1++;
     pw_exp2++;
    }
    else
    {
     pw_exp1 = pw_old;  //RollBack
    }
   }

   if ((char*)pw_exp1 != p2)  //词 表找到单词
   {
    for(int x=0; x<((char*)pw_exp1 - p2); x++)  //存 储识别单词
    {
     *p1 = *(p2+x);
     p1++;
    }
    *p1 = '/';  //填 入分隔符
    p1++;
    p2 =(char*) pw_exp1;   //查 询下一个
    pw_old = pw_exp1;      //Can RollBack
   }

   if (*p2 == '/0') //查 完了!
   {
    break;
   }

  }
 }

//查 询完辞典!
 if( ((char*)pw_exp1 == p2) && (*p2 != '/0') ) //词 表里没有找到
 {
  cout<<"不可识别的短语!";
 }
 else{
  cout<<"识别完毕! :" ;
  cout<<phrase;}
 
 return 0;
}

int CountWord(char* words)
{
 int n = 0;
 while(*words != '/0')
 {
  words++;
  n++;
 }
 return int(n/2);
}

这篇关于中文词法分析的简单程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903190

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,