1.String或是StringBuffer(建议用) 中的indexOf("中华")方法,查找给定的的字符串中是否有给定词表中的词。
2.借鉴编译原理中的状态装换的思想。
先编写一个状态机,用于测试给定字符串中的词是否满足词表中的内容。
写在最后:1)建议使用第一种方法,因为在java 内部实现的查找 *** 作其实 和你想得思路是相同的,不过他的效率会高些。
2)如果个人的编程能力比较强或是不考虑效率只是想实现专有的分词算法。可以使用第二种方法。
3)以上的两种方法都可以使用多线程来提高程序的效率。
1.打开vs之后,按照下面的方式新建project。新建的工程名是text-segmentation。建好之后在你选择的那个目录会出现一个text-segmentation文件夹。2.从nlpir官网下载相关资源,这里下载的是2013版本。下载地址:http://ictclas.nlpir.org/upload/20140324095815_ICTCLAS2014.rar
3.将下载文件解压缩,找到其中的Data文件夹、bin文件夹中的NLPIR.dll文件、include文件夹中的NLPIR.h文件、lib文件夹
中的NLPIR.lib文件,将这四个东西复制到刚刚的text-segmentation文件夹中的text-segmentation文件夹下,如下
效果:
4.点击text-segmentation文件夹下的text-segmentation.sln,在vs中打开这个项目。按照如下方式将NLPIR.h文件加入到头文件中。
5.点击project ->properties(快捷键ALT +
F7),按照下图所示的进行设置。别问我为什么这么设置,我也不懂,摸索了半天才摸索出来的,不这么设置就是搞不定。
6.在source里面新建程序新建c++源程序
7.接下来就可以在这里写代码了,下面附上一段我的代码作为例子。最关键的是前面的函数头部分,可以直接抄过去。
#ifndef OS_LINUX
#include
#pragma comment(lib, "NLPIR.lib")
#endif
#include
#include
#include
#include
#include
#include "NLPIR.h"
#include
using namespace std
void IfInit()//判断是否已经成功初始化
void IfExit()//是否成功退出
int main()
{
IfInit()//初始化程序
NLPIR_SetPOSmap(ICT_POS_MAP_SECOND)
int nitems//
nitems=NLPIR_ImportUserDict("H:\\sentence\\UserDict_manual.txt")
NLPIR_SaveTheUsrDic()
cout<<"import "<<nitems<<"
words"<<endl
//NLPIR_AddUserWord("A股")
//NLPIR_AddUserWord("沪指")
//int i
//char s[100]
//char s2[100]
//ifstream infile
////infile.open("H:\\sentence\\files to break
word.txt")
//infile.open("C:\\Users\\pc\\Desktop\\temp\\file_to.txt")
//ifstream infile2
////infile2.open("H:\\sentence\\files after break
word.txt")
//infile2.open("C:\\Users\\pc\\Desktop\\temp\\file_after.txt")
//for(i=0i<717696i++)//1798
//{
// if (i<350000)
// {
// infile.getline(s,100)
// infile2.getline(s2,100)
// continue
// }
// infile.getline(s,100)
// infile2.getline(s2,100)
// NLPIR_FileProcess(s,s2,0)
// cout<<i+1<<endl
//}
NLPIR_FileProcess("try.txt","try_result.txt",0)
IfExit()//退出
system("pause")
return 0
}
void IfInit()//判断是否已经成功初始化
{
if(!NLPIR_Init(0,UTF8_CODE))
{
cout<<"Init fails"<<endl
exit(EXIT_FAILURE)
}
else
{
cout<<"Init ok"<<endl
}
}
void IfExit()//是否成功退出
{
if(!NLPIR_Exit())
{
cout<<"Exit fails"<<endl
}
else
{
cout<<"Exit ok"<<endl
}
}
8.若函数报错,可以去text-segmentation文件夹中的text-segmentation文件夹下查看log文件。常见的错误是Initial
Fail,这很可能是因为license过期了,解决方法可见http://blog.csdn.net/heyu158/article/details/17525753
。
中文分词主要有三种技术,分别为:
基于统计的分词模型其主要思想是把每个词看作是由词的最小单位的各个字组成的,如果相连的字在不同的文本中出现的次数越多,就证明这相连的字很可能就是一个词。
其一般分为两步:
语言模型中常用的为n元模型,所谓n元模型就是在估算条件概率时,忽略距离大于等于n的上文此的影响,其概率计算公式如下:
一般使用频率计数的比例来计算n元条件概率
当n越大时,模型包含的词序信息越丰富,同时计算量随之增大。与此同时,长度越长的文本序列出现的次数也会减少。同时为避免出现分母为零的情况,一般在n元模型中与要配合相应得平滑算法来解决这个问题,例如拉普拉斯平滑等
隐含马尔可夫模型是将分词作字在字串中得序列标注任务来实现的,其基本思路是:每个字在构造一个特定的词语时都占据着一个确定的构词位置。
用数学抽象表示如下: 用 代表输入的句子,n为句子长度, 代表输出的标签,理想输出为:
我么们假设每个字的输出仅仅与当前字有关,就可以得到:
通过贝叶斯公式我们可以把最大化 转化为最大化
针对 作马尔可夫假设,得到:
对 有:
作齐次马尔可夫假设的计算公式如下(这个公示表示,每个输出仅仅与上一个输出有关):
于是得到:
~
在HMM中,求解 的常用方法是Veterbi算法,这个算法的核心思想是: 如果最终的最优化路径经过某个 ,那么从初始节点到 点的路径必然也是一个最优路径。
最常用的就是先基于词典的方式进行分词,然后再用统计分词方法进行辅助。
jieba分词结合了基于规则和基于统计这两类方法。
jieba提供了三种分词模式:
除了可以进行分词外,还可以进行词性标注。
下面是各种分词工具比较:
图片 来自
还有 NLPIR汉语分词系统 ,主要功能包括中文分词;英文分词;词性标注;命名实体识别;新词识别;关键词提取;支持用户专业词典与微博分析。NLPIR系统支持多种编码、多种 *** 作系统、多种开发语言与平台
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)