微信在国内已经越来越火了,特别是有了公众平台之后,出现了很多好玩的聊天机器人。比如武大助手,号称在24小时只能搭建完成。给了同学们很多方便。

最近在TEDxFactory798从事志愿者工作,负责技术部分。因为工作需要而想到了搭建TEDxFactory798的微信平台,而SAE(Sina App Engine)是国内最早开始提供云服务的平台之一,而且几乎是免费的。所以希望能够通过SAE平台快速的搭建好一个微信公众账号。在一边摸索一边学习的情况下,小半天就搭好了一个简易的微信公众平台。

首先注册微信公众账号:http://mp.weixin.qq.com,点击注册,通过很简单的几步就能快速注册好公众账号,需要注意的是这里是需要注册一个新的微信号,而不是通过已有的私人微信号绑定。可能需要注册一个专用的邮箱。注册过程很简单,不赘述。

第二步是注册SAE,访问http://sae.sina.com.cn,SAE整个的文档都比较完整,很好上手。注册完成后会送500云豆,合人民币5元。再申请实名认证,送云豆2000。对于一个刚上手的开发者来说完全够了。等应用开发好后,还可以申请开发者认证。每月有固定额度的云豆赠送,基本就不用花钱了。另外还有教育机构认证,公益组织认证等。同样十分简单,不赘述。

第三步,登录公众平台后,点击高级功能。首先要关闭编辑模式,才能进入开发模式。(可以先不关闭, 等自己的服务器假设好之后再关闭)。阅读微信公众平台文档:http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5。我们看到需要提供一个接入信息:

接口配置

接口配置

那么我们需要一个网址作为接口,Token呢,就是相当于我们和微信之间约定的“密码”,以验证是微信平台的访问。再阅读接下来的要求:

网址接入

公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:

参数 描述
signature 微信加密签名
timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。

signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

那么很明确我们接下来需要做的事情了:为微信提供一个接口。

第四步:在SAE上创建一个应用。在我的应用中点击创建应用:

创建应用

创建应用

填好二级域名和应用名称等,选择好语言。这里我们使用Python开发选择web应用。创建好应用之后,在代码管理中创建一个新的版本。而后我们可以选择编辑代码。能够实现在线编辑,根本用不着配置本地环境,SVN等等。当然如果你觉得需要也可以根据文档配置本地环境开发。:

代码管理

代码管理

代码编辑页

代码编辑页

那么下一步我们就要开始Hello World了。

第五步:编写Hello World。

我们这里选择web.py框架编写网页应用。该框架非常小,学习代价很低。有中文文档:http://webpy.org/cookbook/index.zh-cn。SAE平台有两个很重要的文件,一个是config.yaml,是应用的配置文件,另一个是index.wsgi,是应用的入口文件。这两个文件在创建应用的时候就已经生成了。现在打开config.yaml文件,修改为:

[code]

name: youappnapp
version: 1
libraries:
– name: webpy
version: "0.36"
[/code]

name为你的应用名,版本为1,库应用webpy,这个是SAE预装的库。预装版本为0.36。我们也就使用0.36版。修改完成后使用Ctrl+S保存,这个细节做得很好,和本地保存一样,非常方便,当然也可以使用右上角的全部保存按钮。

接下来打开index.wsgi文件,修改如下(与官方文档的hello world略有不同):

[python]
# coding: UTF-8
import os

import sae
import web

urls = (
‘/’, ‘Hello’
)

app_root = os.path.dirname(__file__)
templates_root = os.path.join(app_root, ‘templates’)
render = web.template.render(templates_root)

class Hello:
def GET(self):
return render.hello("你好")

app = web.application(urls, globals()).wsgifunc()

application = sae.create_wsgi_app(app)
[/python]

这里的coding:UTF-8告诉python文件的编码是UTF-8,对于带中文的应用来说必不可少。简单解释一下,最下面显而易见的是应用的入口,那么url配置到我们用那个类来实现路由,比如上述代码中的url是指根目录用Hello类来处理。在类中实现GET和POST方法就能处理相应的http请求。还需要注意到的是有个templates目录,在其中有个hello.html文件来实现模板。模板参数传递进一个”你好”。具体可见webpy教程。

接下来我们点击左上角的创建目录,创建一个叫做templates的目录,双击进入目录,再创建一个叫做hello.html的文件。代码如下:

[html]
$def with (name)
Hello $name!
[/html]

即定义一个name的参数(就是我们传进来的“你好”),在模板中任意地方引用$name就会被参数替代掉。

至此,Hello World已经写完了。访问应用根目录就能看到:

Hello 你好

的页面了。

待续。

下一篇文章:利用SAE搭建微信公众平台(二)

最近在准备毕设开题,要写论文,有各种参考文献。网上找了一下word中插入参考文献的方法,主要是尾注的形式。想起来之前在学校图书馆网站上下载过一个叫做NoteExpress的软件,可以方便的管理和插入参考文献,把具体使用方法写出来分享一下。

一、下载软件:http://www.reflib.org/download_chs.htm。这里面有各个大学、科研单位图书馆以及国图版的软件下载。可以免费获得正版授权。找自己对应的学校下载。

二、安装软件:过程不赘述。跟大多数软件安装过程一样,如果没有意外的话,Word插件也会同时装好。只是64位的Word需要单独下载和安装,下载连接中有安装说明,并且插件暂时只有英文版,我的就是,所以只能在用英文的插件来进行演示,好在非常简单。

三、管理文献:

3.1新建数据库:

1.文件->新建数据库

新建数据库1

新建数据库1

2.选择数据库路径。并选择复制文件到附件文件夹,这样可以更方便管理论文集。

新建数据库2

新建数据库2

3.2检索文献:

其实可以跳过这步,完全可以用手动输入文献的相关信息来代替。但是如果想偷懒的话,就完全可以利用NoteExpress的检索功能来帮你自动完成文献信息。

1.检索->在线检索->选择在线数据库。选择一个数据库,可以选选择你下载文献的数据库,保证一定有该文献。

检索1

检索1

或者:选择一个已经检索过的数据库:

检索2

检索2

2.检索。选择检索的方式,点击开始检索。

检索3

检索3

3.双击检索出来的文件,可以编辑信息。如果不全可以补全。

检索4

检索4

4.保存检索结果:选择保存勾选的题录->至文件夹:题录

检索5

检索5

3.3插入附件:可以使的题录与文件关联。选择要要关联的题录,附件标签,右键添加文件。

附件

附件

3.4选择插入样式:设置出入到word中的样式

1.工具->样式->样式管理器

样式1

样式1

2.选择合适的样式,比如国标样式,可以直接收缩GB

样式2

样式2

3.双击样式名,可以更改样式。比如点击布局。

样式3

样式3

四、在word中插入和删除参考文献:

4.1插入

1.在word工具栏中选择NoteExpress 工具栏,点击双窗口显示,这样比较好操作。

插入1

插入1

2.选择你要插入的文献,光标保持在腰插入的位置,点击插入引用。

插入2

插入2

3.这是插入后的参考文献列表,已经已国标形式展示。

插入3

插入3

4.2删除:和官方某些文档上不太一样,因为没有直接的删除引用按钮。但是可以用如下方式实现

1.选择编辑引用

删除1

删除1

2.选择要删除的引用,点击删除,确定。

删除2

删除2

3.删除之后的参考文献,对比插入的参考文献。

删除3

删除3

五、更多帮助:

1.NoteExpress 与endNote的比较。

2.NoteExpress使用教程,百度文库

在国内研究自然语言处理的人大概都知道ICTCLAS分词系统的大名。该系统是由张华平博士开发的基于层叠隐性马可夫链的分词系统,在中文分词领域具有领先的优势。今年一月张华平博士已经放出了最新的ICTCLAS2013分词系统,并更名为NLPIR,加入了新词发现,微博分词等功能。

在官方网站上,提供了C,Java,C#等语言的绑定。本文将介绍把最新的NLPIR分词系统与Python绑定的方法。

首先下载swig,swig可以帮助我们将C或者C++编写的DLL或者SO文件绑定到包括Python在内的多种语言。Windows下将安装包下载到一定目录下将该目录加入环境变量的path中即可使用swig(当然也可以输入完整的路径来使用swig)。可以打开命令行窗口,在里面输入swig,如果出现“Must specify an input file. Use -help for available options.”则表示一切顺利。

下面通过swig来讲NLPIR系统封装成Python的扩展。新建一个空白的目录,取名为nlpirpy_ext。首先要写的是swig的接口文件,可以参考swig文档的写法,下面就简单介绍一下:

[code]
%module NLPIR
%{
#define SWIG_FILE_WITH_INIT
#include "NLPIR.h"
%}
/*封装所有头文件中的api*/
#define POS_MAP_NUMBER 4
#define ICT_POS_MAP_FIRST 1
#define ICT_POS_MAP_SECOND 0
#define PKU_POS_MAP_SECOND 2
#define PKU_POS_MAP_FIRST 3
#define POS_SIZE 40
#define GBK_CODE 0
#define UTF8_CODE GBK_CODE+1
#define BIG5_CODE GBK_CODE+2
#define GBK_FANTI_CODE GBK_CODE+3
bool NLPIR_Init(const char * sDataPath=0,int encode=GBK_CODE);
bool NLPIR_Exit();
const char * NLPIR_ParagraphProcess(const char *sParagraph,int bPOStagged=1);
const result_t * NLPIR_ParagraphProcessA(const char *sParagraph,int *pResultCount,bool bUserDict=true);
int NLPIR_GetParagraphProcessAWordCount(const char *sParagraph);
void NLPIR_ParagraphProcessAW(int nCount,result_t * result);
double NLPIR_FileProcess(const char *sSourceFilename,const char *sResultFilename,int bPOStagged=1);
unsigned int NLPIR_ImportUserDict(const char *sFilename);
int NLPIR_AddUserWord(const char *sWord);//add by qp 2008.11.10
int NLPIR_SaveTheUsrDic();
int NLPIR_DelUsrWord(const char *sWord);
double NLPIR_GetUniProb(const char *sWord);
bool NLPIR_IsWord(const char *sWord);
const char * NLPIR_GetKeyWords(const char *sLine,int nMaxKeyLimit=50,bool bWeightOut=false);
const char * NLPIR_GetFileKeyWords(const char *sFilename,int nMaxKeyLimit=50,bool bWeightOut=false);
const char * NLPIR_GetNewWords(const char *sLine,int nMaxKeyLimit=50,bool bWeightOut=false);
const char * NLPIR_GetFileNewWords(const char *sFilename,int nMaxKeyLimit=50,bool bWeightOut=false);
unsigned long NLPIR_FingerPrint(const char *sLine);
int NLPIR_SetPOSmap(int nPOSmap);
bool NLPIR_NWI_Start();//New Word Indentification Start
int NLPIR_NWI_AddFile(const char *sFilename);
bool NLPIR_NWI_AddMem(const char *sText);
bool NLPIR_NWI_Complete();
const char * NLPIR_NWI_GetResult(bool bWeightOut=false);
unsigned int NLPIR_NWI_Result2UserDict();
[/code]

%module 后面跟的是模块名,也就是Python中import后跟名字。

%{
%}中的是放头文件的地方(所以说用swig做封装的话,至少得有头文件。)

其中“#define SWIG_FILE_WITH_INIT”是说封装成扩展的时候包含python的__init__.py的内容。”#include “NLPIR.h””大家懂的。

接下来那一堆#define也就是从头文件中复制出来的,这样在封装之后这些define的内容直接可以再模块中使用。

再接下来的函数声明就是要从C文件中导出的接口了。

下面再写一个setup.bat文件,将swig和扩展接口的工作统一起来:

[code]
swig -c++ -python NLPIR.i
python setup.py build_ext –inplace
echo "Build Complete!"
pause
[/code]

第一行就是swig的命令。-c++是说扩展的是C++编写的库, -python当然是说扩展为Python,NLPIR.i就是刚才写的接口文件

第二行我不懂……这是照别人写的,Python刚入门,对这些都还不太熟悉。包括接下来setup.py里面的内容也不太懂,都是依样画葫芦。大家可以参看以下这方面的教程。

[python]
”’
setup.py file for NLPIR
”’
from distutils.core import setup, Extension

NLPIR_module = Extension(‘_NLPIR’,sources=[‘NLPIR_wrap.cxx’], libraries = [‘NLPIR’])
setup(name = ‘NLPIR’,
version = ‘1.0’,
author = ‘SWIG Docs’,
description = ‘pyd for NLPIR’,
ext_modules = [NLPIR_module],
py_modules = [‘NLPIR’],
)
[/python]

要注意的两点是,第一是Extension的第一个参数前一定要有个”_”这是swig的规定,souces里面的cxx代表的就是c++文件。是第一步swig自动生成的文件。

接下来在目录里放置一个空白的__init__.py文件。为的是这个扩展可以直接放到python的目录中取。

最后,讲下载好的NLPIR文件夹中的NLPIR.dll,NLPIR.h,NLPIR.lib,Data文件夹放到和刚才同样的目录下。运行setup.bat

我就是在这里遇到了很大的问题的:我的是64位的win7系统,装的是64位的Python2.7.3。首先,在运行bat文件后,第一步能成功,在第二步的时候,首先Python会去查找VS2008的编译器,因为windows Python2.7.3本身就是VS2008编译的,但我恰恰装的是VS2012Express,所以查找失败。爆出:“Unable to find vcvarsall.bat”的错误,几经周折,发现如下解决方法:直接更改C:/Python32/Lib/distutils/msvc9compiler.py文件。。。然后失败了。。然后找到了改环境变量的方法:添加”VS90COMNTOOLS”指向VS2012的环境,例如C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\。

到此时好像更进一步了,但是又遇到了新的问题:不是正确的win32文件。然后我发现问题出在Express版本的编译器不能编译64位文件……要么安装一个1.4G的windows的东西,要么换成32位版本的python……我表示败了,还是换32版本python吧,两个版本并存好了。

重新安装python32位版,更改环境变量指向新的Python,搞定。

上述工作完成后,将文件夹拷到python安装目录下的lib\site-packages目录下,就可以直接使用该扩展了。

下面是一个文中所提到的源代码的打包下载,一个是只含上述源代码的:nlpirpy_ext原始版.7z。另一个已经通过swig封装过了,目前只支持windows python2.7.3 32位版。其他环境需要自己封装或者测试,还带有一个小的Seg.py,是进一步封装的分词器类:NLPIRPY_EXT_built版.7z

本文就到这里了,欢迎指正:

参考文献:

一、现有命名实体识别使用方法及达到的效果

现有的命名实体识别方法,主要包括隐性马科夫链,最大熵,CRF等。

根据综述:在这4种学习方法中,最大熵模型结构紧凑,具有较好的通用性,主要缺点是训练时间复杂性非常高,有时甚至导致训练代价难以承受,另外由于需要明确的归一化计算,导致开销比较大。而条件随机场为命名实体识别提供了一个特征灵活、全局最优的标注框架,但同时存在收敛速度慢、训练时间长的问题。一般说来,最大熵和支持向量机在正确率上要比隐马尔可夫模型高一些,但是隐马尔可夫模型在训练和识别时的速度要快一些,主要是由于在利用Viterbi算法求解命名实体类别序列的效率较高。隐马尔可夫模型更适用于一些对实时性有要求以及像信息检索这样需要处理大量文本的应用,如短文本命名实体识别。

但在实际实现中,仍然有不少采用ME的实现实例。但是可能是由于所找论文的质量原因,由ME实现的命名实体识别效果并不理想。反而是几个基于隐性马科夫链的实现效果较好。目前找到的唯一的基于CRF实现的实例效果并不是很好。

现将现有的一些实现及其效果罗列如下:

基于ME的方法:

1.南京大学2007硕士学位论文:吴宝琪《中文命名实体的识别方法研究及其实现》,对于人名识别:准确率为68.O%,召回率为40.2%,F值为50.5%对于地名识别:准确率为48.7%,召回率为31.1%,F值为39.O%对于组织名识别:准确率为51.2%,召回率为27.6%,F值为35.9%。其效果不好的原因由几个,一个是特征选择有待考量,二个是为了研究而研究,没有使用分词技术。但是论文中有一些可取的筛选方法。

2.哈工大2009年:付瑞吉,车万翔,刘挺《一种基于分类方法的音乐命名实体识别技术》音乐命名实体识别总的精确率、召回率和F值分别达到了89.89%,81.01%,87.93%。

3. 余传明,黄建秋,郭 飞。2011《从客户评论中识别命名实体》

从客户评论中识别命名实体

从客户评论中识别命名实体

中采用的几个模板,效果都不好。同样存在训练集太小的因素。

基于CRF的方法:

1.苏州大学2010年学位论文:史海峰《基于CRF的中文命名实体识别研究》。

命名实体 精确率P 召回率R F值
人名 98.4% 65.7% 78.8%
地名 96.3% 67.2% 79.2%
机构名 98.3% 78.2% 87.1%

作者分析可能产生了过拟合。本论文使用的训练集过小。

基于HMM的方法:

1.2004年哈工大:廖先桃 于海滨 秦兵 刘挺《HMM与自动规则提取相结合的中文命名实体识别》。

HMM与自动规则提取相结合的中文命名实体识别

HMM与自动规则提取相结合的中文命名实体识别

 

2.2006年中科院:俞鸿魁,张华平,刘群,吕学强,施水才《基于层叠隐马尔可夫模型的中文命名实体识别》。

封闭测试:

基于层叠隐马尔可夫模型的中文命名实体识别 封闭测试

基于层叠隐马尔可夫模型的中文命名实体识别 封闭测试

开放测试(人民日报1998.6):

基于层叠隐马尔可夫模型的中文命名实体识别 开放测试

基于层叠隐马尔可夫模型的中文命名实体识别 开放测试

总结:

最大熵方法在理论上有最好的效果,从CoNLL.2003会议的报告来看,最大熵模型相对更适合于处理命名实体识别问题,在参赛的16对选手中,有5对选手使用了最大熵模型。而且从竞赛的结果来看,英文的命名实体识别竞赛的前三名和德语的命名实体识别竞赛的前两名都采用了最大熵的方法,但是训练成本比较高。在CRF方面的研究还比较少。HMM模型看来能够取得的效果也不差,可以再HMM上加以进一步改进以提高其效果。