字典分词 代码(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;
}

输出:

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

最新文章

  1. jquery 使用方法&lt;转载&gt;
  2. .NET: C#: Attribute
  3. SDcard进行文件的读取
  4. codeforces C. Restore Graph
  5. vim各种编码设置问题
  6. 搭建vue开发环境的步骤
  7. PHP处理上传文件
  8. openstack安装过程遇到的问题
  9. Python_编写UDP通信编解码类、文件的上传、远程执行命令、黏包
  10. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
  11. 解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题
  12. ES6学习(二)基础命令
  13. 设置idealUI选中变量的颜色与同名称变量的颜色一致
  14. 关于RAID_1+0和RAID_0+1的比较
  15. Uva1395 POJ3522 Slim Span (最小生成树)
  16. 解决命令行运行python文件,出现No module named *** 报错问题
  17. postman app支持浏览器上的cookie
  18. c++ 容器排序
  19. 小程序获取access_token
  20. JAVA垃圾回收机

热门文章

  1. Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
  2. 使用JDBC进行数据库的事务操作(2)
  3. Tomcat 用户配置
  4. php 跳转控制
  5. HDU4939Stupid Tower Defense (有思想的dp)
  6. android自定义实现抽屉SlidingDrawer的功能
  7. cocos2d/-x 用CCRenderTexture为一个CCLabelTTF创建阴影。
  8. SilkTest Q&amp;A 4
  9. MingW环境下的windows编程
  10. SVN无法修改以前提交日志的办法