正则做语义解析的优劣势

正则表达式(简称:正则)做语义解析是一种方法经典的方法。该文章简单的总结了正则方法的优势和劣势。

正则表达式(简称:正则)做语义解析是一种方法经典的方法。在上世纪60年代,大量的对话系统、专家系统都是用模式匹配来做,其中正则就是一个非常实用且易学的工具。具有代表性的Eliza,在当时让大家都以为这个机器能理解自然语言,即使说明了其中的原理,也有不少人认同它的智能。这套方式一直被延续至今,基本在市面上能看到的chatbots,都或多或少的保留了正则的部分。也许说到这里,有人认为马上要介绍正则如何做对话了,这篇记录只是记录一下在工作中,正则的优势和劣势。另外基于统计的方法,这里不做说明。

Continue reading “正则做语义解析的优劣势”

seq2seq模型的字符级的向量表示

这篇文章将简单介绍seq2seq模型+attention机制,以及在这个模型下,字符级逐字的输入和输出任务产生的句向量的特性。

许久未更博了,在前段时间测试了用seq2seq做ner任务,可以参考之前的文章《RNN的Seq2Seq模型做命名实体识别》 ,之后通过NER做NLU,再加上RL尝试多轮对话,结果达到了期望,但是还有很多工作需要去做,多轮语料采集、句子相似度、句向量,在多轮对话中,我没有尝试将每句话进行分类,我认为句子本身表意就非常清晰,标注反而画蛇添足,特别是上下文中的句子,其意思根据上下文而变化。那么对话中去匹配距离最近的句子,并且人为的反馈,可能是一个多轮对话的主要方式。

这篇文章将简单介绍seq2seq模型+attention机制,以及在这个模型下,字符级逐字的输入和输出任务产生的句向量的特性。 Continue reading “seq2seq模型的字符级的向量表示”

RNN的Seq2Seq模型做命名实体识别

seq2seq 具有极强的时序能力,在自然语言处理(NLP)中是一个很强的模型,最近一段时间,在工程方面将该模型引入做命名实体识别(NER)也取得不错的效果。推荐G.Hinton的论文“Grammar as a Foreign Language”,讲述了如何用seq2seq做序列标注。

seq2seq 具有极强的时序能力,在自然语言处理(NLP)中是一个很强的模型,最近一段时间,在工程方面将该模型引入做命名实体识别(NER)也取得不错的效果。推荐G.Hinton的论文“Grammar as a Foreign Language”,讲述了如何用seq2seq做序列标注。
Continue reading “RNN的Seq2Seq模型做命名实体识别”

自然语言处理中做字符级embedding的一种检索思路

自然语言处理中字符级的embedding可以通过unicode的编码来做索引

自然语言处理中需要将字、词或句子做embedding之前,一般会将对象转成一个字典中的索引,比如

假如,要处理字符级的索引问题,建议使用unicode的方式,这样可以直接获取唯一的编码

在Python中通过ord函数实现:

ord=(u"吃")
# 21507

RDF API – Jena 手册

概述

资源描述框架(RDF)是一套万维网委员会(W3C)推荐的描述资源的标准。什么是资源?这实在是一个很有深度的问题并且对它的准确定义也一直是一个争辩的论题。对我们来说,它是所有我们能够识别的东西。比如,你是一个资源,同样你的个人主页、这篇教程、数字1和Moby Dick的《The Greath White》。

这篇教程,我们使用的所有例子都是关于人的,介绍了一个使用RDF做VCARDS陈述的方式。RDF的表现格式最好是通过节点和弧构成的图,如下所示,一个简单的vcard在RDF里面可以看成这样:

figure 1

Continue reading “RDF API – Jena 手册”

JENA手册-入门

APACHE JENA,一款做语义网(Semantic Web)和连接资料(Link Data)应用的免费开源JAVA框架。JENA拥有一整套完整的添加删除、推理、SPARQL查询、存储的模块,来满足我们的需求。

APACHE JENA,一款免费的JAVA开源框架,用来做语义网(Semantic Web)和数据连接(Linked Data)的应用。Jena支持的RDF格式数据,是一套NoSQL(非关系数据库),即一套可推理的图数据库。Jena框架将这类数据的存储、添加、删除、推理,查询(Sparql)等所有的操作封装进一个框架,大大的方便了做相关应用的开发和使用。本手册主要介绍Jena框架及其操作,以便于日后查询,希望能对大家有所帮助。

jena-logo

Continue reading “JENA手册-入门”

Google 全球商机洞察

Google 全球商机洞察(Global Market Finder)是谷歌基于搜索信息、关键词广告和谷歌翻译推出的一款洞察全球商机的服务。在这服务中,谷歌大量的搜索、关键词竞价广告再一次被深度挖掘,通过对这些信息的区域划分来获取全球市场的竞争关系,而其中不同地域不同的用词问题,通过谷歌翻译做技术解决,确实是该项目的最佳配合点。这个2013年出来的成果,虽然今天才看到,还是很赞的。自己本身是做自动对齐不同语言文本的语料,其中关键词的自动对齐在技术上也解决了,所以对于解决方案的建立提供了一个很好的参考。 Continue reading “Google 全球商机洞察”

读取IRI的Graph存入特定Graph – Virtuoso Jena Provider

该例读取下面三个IRI的内容,并返回RDF数据。这个例子比较有意思的是能够在
数据库里面创建一个Graph。
IRI:
http://kidehen.idehen.net/dataspace/person/kidehen#this
http://www.w3.org/People/Berners-Lee/card#i
http://demo.openlinksw.com/dataspace/person/demo#this


import org.apache.jena.query.Query;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.RDFNode;

import virtuoso.jena.driver.*;

public class VirtuosoSPARQLExample2 {

	/**
	 * Executes a SPARQL query against a virtuoso url and prints results.
	 */
	public static void main(String[] args) {

		String url;
		if(args.length == 0)
		    url = "jdbc:virtuoso://localhost:1111";
		else
		    url = args[0];

/*			STEP 1			*/
		/*
		 * 这里添加"Example2"后,类似于打开一个Graph叫做"Example2",,
		 * 如果没有会自动生成一个名为"Example2"的图
		 */
		VirtGraph graph = new VirtGraph ("Example2", url, "dba", "dba");

/*			STEP 2			*/
/*		Load data to Virtuoso		*/
		//清除"Example2" Graph
		graph.clear ();
		
		/*
		 * 这里是读取IRI的Graph并存储到服务器的"Example2"
		 * 这里的读取,类似于在Web端在Quad Store Upload上的操作类似
		 * 如果网络连接不了,可以尝试删除下面的那些失败的内容
		 */
		System.out.print ("Begin read from 'http://www.w3.org/People/Berners-Lee/card#i'  ");
		graph.read("http://www.w3.org/People/Berners-Lee/card#i", "RDF/XML");
		System.out.println ("\t\t\t Done.");

		System.out.print ("Begin read from 'http://demo.openlinksw.com/dataspace/person/demo#this'  ");
		graph.read("http://demo.openlinksw.com/dataspace/person/demo#this", "RDF/XML");
		System.out.println ("\t Done.");

		System.out.print ("Begin read from 'http://kidehen.idehen.net/dataspace/person/kidehen#this'  ");
		graph.read("http://kidehen.idehen.net/dataspace/person/kidehen#this", "RDF/XML");
		System.out.println ("\t Done.");


/*			STEP 3			*/
/*		Select only from VirtGraph	*/
		Query sparql = QueryFactory.create("SELECT ?s ?p ?o WHERE { ?s ?p ?o }");

/*			STEP 4			*/
		VirtuosoQueryExecution vqe = VirtuosoQueryExecutionFactory.create (sparql, graph);

		ResultSet results = vqe.execSelect();
		while (results.hasNext()) {
			QuerySolution result = results.nextSolution();
		    RDFNode graph_name = result.get("graph");
		    RDFNode s = result.get("s");
		    RDFNode p = result.get("p");
		    RDFNode o = result.get("o");
		    System.out.println(graph_name + " { " + s + " " + p + " " + o + " . }");
		}

		System.out.println("graph.getCount() = " + graph.getCount());
	}
}

连接Virtuoso和SPARQL查询 – Virtuoso Jena Provider

想要使用JAVA连接Virtuoso,我想最关心的额就是如何连接并查询,下面代码演示了如何操作

import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.RDFNode;

import virtuoso.jena.driver.*;

public class VirtuosoSPARQLExample1 {

	/*
	 * Executes a SPARQL query against a virtuoso url and prints results.
	 */
	public static void main(String[] args) {

		String url;
		if(args.length == 0)
		//如果Virtuoso安装在本体,这个是默认的地址和端口
		    url = "jdbc:virtuoso://localhost:1111"; 
		else
		    url = args[0];

/*			STEP 1			*/
		//连接服务器,两个“dba”分别是账号和密码,是初始状态Virtuoso的默认值
		VirtGraph set = new VirtGraph (url, "dba", "dba");

/*			STEP 2			*/


/*			STEP 3			*/
/*		Select all data in virtuoso	*/
		//给出查询语句,这里使用的是Jena框架里的
		Query sparql = QueryFactory.create("SELECT * WHERE { GRAPH ?graph { ?s ?p ?o } } limit 100");

/*			STEP 4			*/
		//在服务器"set"上执行查询语句"sparql"
		VirtuosoQueryExecution vqe = VirtuosoQueryExecutionFactory.create (sparql, set);

		//获取结果,这些就和Jena的操作一模一样了
		ResultSet results = vqe.execSelect();
		while (results.hasNext()) {
			QuerySolution result = results.nextSolution();
		    RDFNode graph = result.get("graph");
		    RDFNode s = result.get("s");
		    RDFNode p = result.get("p");
		    RDFNode o = result.get("o");
		    System.out.println(graph + " { " + s + " " + p + " " + o + " . }");
		}
	}
}