C++中嵌入python脚本(结巴分词)

原创 2016年06月01日 13:21:05

这篇主要讲如何在C++文件中,调用python脚本。下面我会结合我的分词程序的实例,介绍需要的函数和方法。


前段时间比较忙,六月份了,期末考试就陆续开始了。忙着复习,所以写这篇关于python嵌入C++的文章稍微晚了点,有一些细节记不太清了,如果有什么问题,欢迎大家联系我一起讨论。

前段时间在做 一个MFC界面的中文分词小程序的时候,发现了一些很有趣的事:传统的机械分词在处理一些较为阴险的句子时,结果可能会十分搞笑,如下图(正序后向最大匹配法 机械分词)


即使是改进之后的逆序前向分词,第二句还是不够满意:



所以我决定引入更为智能的分词模块——python的结巴分词(jieba)模块!

jieba的安装:进入cmd命令行   →  >>pip install jieba

...完美~ 

接下来就遇到一个很棘手的问题,就是如何在C++程序中调用python模块,完成我们需要的功能。


首先,我们先来完成用来分词的python脚本的实现

#sql.py

import jieba;

def fenci(s):
	seg_list = jieba.cut(s);
	l= "|".join(seg_list);
	strs = l.encode('gbk');
	return strs;

我们只需要引入jieba模块,然后定义我们的分词函数,其中唯一参数s是传入的字符串;

jieba.cut()用来对s进行分词,并返回一个列表;

strs为一个将分好的词用”|“连接起来的unicode类型变量,注意,这里Unicode变量不能通过类型转换函数str()直接转换成字符串类型,IDE会报错。

不要慌,经过我吐血研究,可以用改变编码类型的方法轻松解决:就是

strs = l.encode('gbk');

然后将得到的字符串返回就OK。


下面就是最关键的内容了

第一步:环境配置

在VS2015中的 解决方案资源管理器中 右键工程名 >>>点击属性


如下图,将包含目录设为python安装所在目录下的include;库目录设为libs文件夹。


如果你的python版本是2.x

在python安装目录中的libs文件夹中,找到python27.lib,复制一份,命名为python27_d.lib。如下图


准备工作就算OK啦


第二步、编写C++程序

在cpp文件中引入头文件

#include<python.h>

编写C++代码:


<span style="white-space:pre">	</span>//初始化python,必须要做
	Py_Initialize();
	
	//初始化python系统文件路径,保证可以访问到 .py文件
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");
	
	//声明python对象类型的变量
	PyObject *pModule = NULL, *pFunc = NULL, *pArg = NULL, *result = NULL;
	//引入模块,参数写.py文件的名字,不用加.py后缀
	pModule = PyImport_ImportModule("sql");
	//直接获取模块中的函数,第二个参数为函数名
	pFunc = PyObject_GetAttrString(pModule, "fenci");
	//参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
	pArg = Py_BuildValue("(s)", st); //st为C++字符指针,s为python字符串类型,()括号的作用是将其保存为元组形式。
	//调用直接获得的函数,并以元组形式传递参数
	result = PyEval_CallObject(pFunc, pArg); 
	char *ss = { 0 };
	//将python类型的返回值转换为c/c++类型
	PyArg_Parse(result, "s", &ss); 
	//结束python嵌入,不能缺少
	Py_Finalize();
	return ss;

然后编译运行,就可以啦~下面放上结巴分词的结果图:

当当当当!


这学期还有一个关于HTML+CSS+PHP+Mysql的Web开发,比较简单,就不发blog了。假期里开始学习Machine Learning的算法,到时候在更新啦~



版权声明:本文为博主原创文章,未经博主允许不得转载。

自然语言处理之:c++中文分词(附源码)

githup地址:https://github.com/jbymy c++中文分词, 分词算法, 有向无环图, hmm,隐性马尔科夫模型...
  • buptxing
  • buptxing
  • 2016年08月02日 11:50
  • 4157

结巴分词

"结巴"中文分词:做最好的Python中文分词组件 "Jieba" (Chinese for "to stutter") Chinese text segmentation: built to be ...
  • wenyusuran
  • wenyusuran
  • 2014年07月01日 09:58
  • 2404

在C++中调用Jieba进行中文分词

背景之前有个小项目用到了中文分词,但当时使用的ICTCLAS需要每个月下载证书,很不方便。后来在网上找到了一个开源的python实现的中文分词器Jieba,可以使用pip直接安装本地。但之前的程序是c...
  • Foolishwolf_x
  • Foolishwolf_x
  • 2017年12月22日 15:34
  • 97

C++嵌入lua脚本

一步一步写 C++嵌入lua脚本 Demo
  • fwb330198372
  • fwb330198372
  • 2016年09月05日 14:08
  • 579

c++写的一个脚本解释器,可以嵌入到程序里由用户动态配置自己的程序

  • 2015年12月25日 16:15
  • 714KB
  • 下载

python 结巴分词(jieba)学习

原文地址:http://www.gowhich.com/blog/147?utm_source=tuicool&utm_medium=referral 源码下载的地址:https://github....
  • XiaoXIANGZI222
  • XiaoXIANGZI222
  • 2016年12月06日 10:33
  • 10224

【Python】用Python的“结巴”模块进行分词

之前都是用计算所的分词工具进行分词,效果不错但是比较麻烦,最近开始用Python的“结巴”模块进行分词,感觉非常方便。这里将我写的一些小程序分享给大家,希望对大家有所帮助。 下面这个程序是对一个文本文...
  • xiaoguaihai
  • xiaoguaihai
  • 2014年06月17日 20:11
  • 14214

对Python中文分词模块结巴分词算法过程的理解和分析

结巴分词是国内程序员用python开发的一个中文分词模块, 源码已托管在github, 地址在: https://github.com/fxsjy/jieba 作者的文档写的不是很全, 只写了怎么用...
  • rav009
  • rav009
  • 2013年09月30日 15:23
  • 38026

python3结巴分词分行拆分统计词频

python3 和 python2 的语法差异应该是最蛋疼的事情了 dict本来就是没有顺序的吧 把dict转换成list 再去排序就会比较好了 #!/usr/bin/env python3 # -*...
  • WhereYouSink
  • WhereYouSink
  • 2017年11月23日 11:23
  • 232

python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库

转载请注明出处 “结巴”中文分词:做最好的 Python 中文分词组件,分词模块jieba,它是python比较好用的分词模块, 支持中文简体,繁体分词,还支持自定义词库。 jieba的分词,提取...
  • HHTNAN
  • HHTNAN
  • 2017年08月02日 17:13
  • 3223
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中嵌入python脚本(结巴分词)
举报原因:
原因补充:

(最多只允许输入30个字)