栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

NLP实验五:形态分析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

NLP实验五:形态分析

一、 实验目的
  1. 掌握限自动机的状态转移过程
  2. 学会编写程序完成对单词的形态分析
二、 实验内容

请实现以下有限自动机的状态转移过程,通过它的状态转移过程可以识别happy的原型, 比较级happier, 最高级happiest,可以将单词的比较级和最高级转换为“原型+后缀”的形式,进行单词形态的还原,其中为输入输出标签对,即输入i不仅进行状态转移,同时会输出y,可以理解为把i转换为y,另外ε为空输入,即不需要输入,可以输出+,可以理解为这一步转移不需要识别字符,直接输出+。状态转移过程需要自己实现。

图1 happy的状态转移过程

三、 实验环境

操作系统:macOS Monterey 12.4
IDE:CLion 语言:C++

四、 解析
nextStates记录了一个状态的后继所有状态,output储存了状态转移的输出,start储存了
初始状态Q。
 
图2  全局变量

在Init函数中构建了对应的确定的有限自动机。
 
图3  构建DFA



图4的代码根据输入的单词和先前构建的DFA,计算了状态转移过程,并输出,实现了形态分析的功能。
 
图4  计算并输出形态分析结果
五、	结果展示
程序运行结果如下图:
 
图5  实验结果展示
形容词的比较级和最高级:
输入happier,输出happier-->happy+er
输入happiest,输出happiest-->happy+est
输入easier,输出easier-->easy+er
输入easiest,输出easiest-->easy+est
结果正确。

ed结尾的过去时:
输入studied,输出studied-->study+ed
结果正确。

ing结尾的现在分词:
输入developing,输出developing-->develop+ing
结果正确。

ly结尾的副词:
输入hardly,输出hardly-->hard+ly
结果正确。
代码
#include 
#include 
#include 
#include 
#include 
using namespace std;
map> nextStates; //给定一个状态,后继所有状态
map,string> output;//状态转换的输;
set start;
void init(){
    start.insert('i');
    start.insert('e');
    start.insert('l');

    nextStates['i']= (vector){'e','n'};
    output[(pair){'i','e'}]= "y+";
    output[(pair){'i','n'}]= "+i";

    nextStates['l']= (vector){'y'};
    output[(pair){'l','y'}]= "+ly";

    nextStates['n']= (vector){'g'};
    output[(pair){'n','g'}]= "ng";

    nextStates['e']= (vector){'r','s','d'};
    output[(pair){'e','r'}]= "er";
    output[(pair){'e','s'}]= "es";
    output[(pair){'e','d'}]= "ed";

    nextStates['s']= (vector){'t'};
    output[(pair){'s','t'}]= "t";
}
string str;
int n=9;
int main() {
    init();
    while(n--){
        char pre=0;
        printf("input:   ");
        cin>>str;
        cout<<"output:  "<";
        for(char c:str){
            if(pre!=0){
                vector tp=nextStates[pre];
                for(char nx:tp){
                    if(nx == c){
                        cout<){pre,c}];
                        pre=c;
                        break;
                    }
                }
                if(pre!=c) cout<
                pre=c;
            }else{
                cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号