编程算法 – 字典分词 代码(C)

编程算法 – 字典分词 代码(C)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

字典分词 代码(C)


本文地址: http://blog.csdn.net/caroline_wendy


给定字典, 给定一句话, 进行分词. 

使用深度遍历(DFS)的方法.

使用一个參数string, 保存当前分支的分词后的句子; 使用一个參数vector, 保存全部可能的组合.

使用一个验证函数, 推断句子能否够分词.


代码:

/*
 * main.cpp
 *
 *  Created on: 2014.9.18
 *  Author: Spike
 *  Copyright (c) 2014年 WCL. All rights reserved.
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <vector>
#include <string>
#include <set>

using namespace std;

bool Match(string s, string m) {
	int l = m.length();
	if (s.substr(0, l) == m) {
		return true;
	}
	return false;
}

bool Validate(string s, vector<string> &dict) {
	//1. calculate all alphabets in the query
	set<char> sc;
	for (size_t i = 0; i < s.length(); i++) {
		sc.insert(s[i]);
	}
	//2. calculate all alphabets in the dictionary
	set<char> dc;
	for (vector<string>::iterator it = dict.begin();
			it != dict.end(); it++)
	{
		for (size_t i = 0; i < (*it).length(); i++) {
			dc.insert((*it)[i]);
		}
	}
	for (set<char>::iterator it = sc.begin(); it != sc.end(); it++) {
		if (dc.find(*it) == dc.end()) {
			return false;
		}
	}
	return true;
}

string Split(string s, vector<string> &dict, string cur, vector<string>& list) {
	if (s.length() == 0) {
		list.push_back(cur);
		return s;
	}
	for (vector<string>::iterator it = dict.begin(); it != dict.end(); it++) {
		if (Match(s, *it)) {
			string tmp = cur;
			string latter = s.substr(it->length(), s.length() - it->length());
			cur += (*it) + "~"; // add current word to cur_str
			cur += Split(latter, dict, cur, list); // split remaining words
			cur = tmp; //back to last status
		}
	}
	return "No Result";
}

vector<string> SplitWords(string s, vector<string> &dict) {
	string cur = "";
	vector<string> list;
	if (!Validate(s, dict)) {
		return list;
	}
	Split(s, dict, cur, list);
	return list;
}


int main()
{
    vector<string> dict={"程序猿","公务员","员","我","喜","做","程序","一","欢","喜欢","做一个","一个"};
    vector<string> words = SplitWords("我喜欢做一个程序猿", dict);
    for (vector<string>::iterator it=words.begin(); it!=words.end(); it++) {
        cout<<(*it)<<endl;
    }
    return 0;
}

简化版本号(没有验证):

/*
 * main.cpp
 *
 *  Created on: 2014.9.18
 *  Author: Spike
 *  Copyright (c) 2014年 WCL. All rights reserved.
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <vector>
#include <string>
#include <set>

using namespace std;

bool Match(string s, string m) {
	int l = m.length();
	if (s.substr(0, l) == m) {
		return true;
	}
	return false;
}

string Split(string s, vector<string> &dict, string cur, vector<string>& list) {
	if (s.length() == 0) {
		list.push_back(cur);
		return s;
	}

	for (vector<string>::iterator it = dict.begin(); it != dict.end(); it++) {
		if (Match(s, *it)) {
			string tmp = cur;
			string latter = s.substr(it->length());
			cur += (*it) + " | "; // add current word to cur_str
			cur += Split(latter, dict, cur, list); // split remaining words
			cur = tmp; //back to last status
		}
	}

	return "No Result";
}

vector<string> SplitWords(string s, vector<string> &dict) {
	string cur = "";
	vector<string> list;
	Split(s, dict, cur, list);
	return list;
}


int main()
{
    vector<string> dict={"程序猿","公务员","员","我","喜","做","程序","一","欢","喜欢","做一个","一个"};
    string s = "我喜欢做一个程序猿";
    vector<string> words = SplitWords(s, dict);
    for (vector<string>::iterator it=words.begin(); it!=words.end(); it++) {
        cout<<(*it)<<endl;
    }
    return 0;
}

输出:

我~喜~欢~做~一个~程序猿~
我~喜~欢~做~一个~程序~员~
我~喜~欢~做一个~程序猿~
我~喜~欢~做一个~程序~员~
我~喜欢~做~一个~程序猿~
我~喜欢~做~一个~程序~员~
我~喜欢~做一个~程序猿~
我~喜欢~做一个~程序~员~

编程算法 - 字典分词 代码(C)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117972.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网络游戏开发基础篇

    本篇的内容,会介绍几个内容:单例,dll动态加载以及一些跨平台的处理。       1、单例:单例模式是一种使用广泛而又比较简单的设计模式,他的定义我就不多介绍了,大家上网一查就知道了,基本都能理解。在游戏开发中,会有很多单件,所以封装一个单例类供后面的开发使用。       本单例使用模板实现,代码如下:[cpp] viewplaincopyprint?//

    2022年4月5日
    42
  • 什么是数据安全,为什么需要数据安全,怎么才能实现数据安全?

    什么是数据安全,为什么需要数据安全,怎么才能实现数据安全?WHAT何为数据安全?数据安全指的是用技术手段识别网络上的文件、数据库、帐户信息等各类数据集的相对重要性、敏感性、合规性等,并采取适当的安全控制措施对其实施保护等过程。与边界安全、文件安全、用户行为安全等其他安全问题相同,数据安全并非是唯一一种能提升信息系统安全性的技术手段,也不是一种能全面保障信息系统安全的技术手段。它就是一种能够合理评估及减少由数据存储所带来的安全风险的技术方式。数据安全…

    2022年5月22日
    33
  • cg029_canvas log in

    cg029_canvas log inSpring-SpringMVC

    2022年10月12日
    3
  • Java 里的异常(Exception)详解

    Java 里的异常(Exception)详解作为一位初学者,本屌也没有能力对异常谈得很深入.只不过Java里关于Exception的东西实在是很多.所以这篇文章很长就是了..一,什么是java里的异常由于java是c\c++发展而

    2022年7月4日
    33
  • win10家庭版打开管理员账户_win10用户账户控制阻止程序运行

    win10家庭版打开管理员账户_win10用户账户控制阻止程序运行win10版本家庭中文版:运行应用程序报错:解决办法(亲试):1.进入”控制面板“–”用户账户“–”用户账户“,选择”更改用户账户控制设置“,选择最后一项,点击”确定“按钮,如下图:2.按

    2022年8月1日
    8
  • awk中使用shell命令_awk引用变量

    awk中使用shell命令_awk引用变量awk 系列Part11:如何让 awk 使用 Shell 变量

    2022年4月22日
    132

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号