学习Gate快一周了,一直在看官方的英文文档,却一直收获不到,想在自己的程序中通过API的方式实现调用Gate完成信息抽取。Gate中的ANNIE可以实现英文的命名实体识别,但是却不支持中文,后来发现Gate提供了中文的插件即放于目录plugins下的Lang_Chinese文件夹中的内容,并且提供了分词的功能,然后尝试了一下,具体思路如下。
1.设置Gate的home等系统变量。
2.调用Gate.init()进行初始化。
3.采用语句加载中文插件: Gate.getCreoleRegister().registerDirectories(new File(pluginsHome, "Lang_Chinese").toURI().toURL())。
4.采用语句
(ConditionalSerialAnalyserController) PersistenceManager.loadObjectFromFile(new File(new File(Gate.getPluginsHome(),"Lang_Chinese"), "resources/chinese.gapp"))
创建控制器。
5.设置语料路径,语料是经过分词后以空格隔开的词语。
6.程序运行。
其中我采用的是IKAnalyer进行分词,词语以空格隔开,作为Gate的输入内容。
部分的代码如下:
setGateHome();
Gate.init();
// Load ANNIE plugin
File gateHome = Gate.getGateHome();
File pluginsHome = new File(gateHome, "plugins");
Gate.getCreoleRegister().registerDirectories(new File(pluginsHome, "Lang_Chinese").toURI().toURL());
Out.prln("...GATE initialised");
// initialise ANNIE (this may take several minutes)
StandAloneChinese chnie = new StandAloneChinese();
chnie.initCHNIE();
// create a GATE corpus and add a document for each command-line
// argument
Corpus corpus = (Corpus) Factory.createResource("gate.corpora.CorpusImpl");
// for(int i = 0; i < args.length; i++) {
// URL u = new URL(args[i]);
// URL u = new URL("file:/d:\\corpus\\corpusedFile.txt");
StringBuffer corpusDir = new StringBuffer("");
corpusDir.append("file:/").append(System.getProperty("user.dir")).append("\\corpusedFile.txt");
URL u = new URL(corpusDir.toString());
FeatureMap params = Factory.newFeatureMap();
params.put("sourceUrl", u);
params.put("preserveOriginalContent", new Boolean(true));
params.put("collectRepositioningInfo", new Boolean(true));
params.put("encoding", "UTF-8");//以UTF-8编码读取信息 否则会出现乱码
Out.prln("Creating doc for " + u);
Document docs = (Document) Factory.createResource("gate.corpora.DocumentImpl", params);
corpus.add(docs);
// } // for each of args
// tell the pipeline about the corpus and run it
chnie.setCorpus(corpus);
chnie.execute();
其中 setGateHome()方法用于设置Gate所需的一些系统属性。
public static void setGateHome() {
System.setProperty("gate.home", "D:\\gate");
String configFileDir = System.getProperty("user.dir") + "\\gate.xml";
System.setProperty("gate.user.config", configFileDir);
String sessionFileDir = System.getProperty("user.dir") + "\\gate.session";
System.setProperty("gate.user.session", sessionFileDir);
System.out.println(System.getProperties().getProperty("gate.home"));
System.out.println(System.getProperties().getProperty("gate.user.config"));
System.out.println(System.getProperties().getProperty("gate.user.session"));
}
下面是中文插件的初始化操作
public void initCHNIE() throws GateException, IOException {
Out.prln("Initialising CHNIE...");
chnController = (ConditionalSerialAnalyserController) PersistenceManager.loadObjectFromFile(new File(new File(Gate.getPluginsHome(),"Lang_Chinese"), "resources/chinese.gapp"));
Out.prln("...CHNIE loaded");
}
最终 程序可以运行,但是却没有标注结果。花了好几天一直没解决掉,真是百思不得其解。只能采取扩展ANNIE的方式进行中文处理了。
若有人发现了 上面所存在的错误,还望指出。