使用Stanford coreNLP的python nltk中的共引用解析
StanfordCorenlp提供了共指解析,还提供了一些关于其在Java中实现的见解 但是,我正在使用python和NLTK,我不确定如何在python代码中使用CoreNLP的共同引用解析功能。我已经能够在NLTK中设置StanfordParser,这是到目前为止我的代码使用Stanford coreNLP的python nltk中的共引用解析,python,nlp,nltk,stanford-nlp,Python,Nlp,Nltk,Stanford Nlp,StanfordCorenlp提供了共指解析,还提供了一些关于其在Java中实现的见解 但是,我正在使用python和NLTK,我不确定如何在python代码中使用CoreNLP的共同引用解析功能。我已经能够在NLTK中设置StanfordParser,这是到目前为止我的代码 from nltk.parse.stanford import StanfordDependencyParser stanford_parser_dir = 'stanford-parser/' eng_model_pat
from nltk.parse.stanford import StanfordDependencyParser
stanford_parser_dir = 'stanford-parser/'
eng_model_path = stanford_parser_dir + "stanford-parser-models/edu/stanford/nlp/models/lexparser/englishRNN.ser.gz"
my_path_to_models_jar = stanford_parser_dir + "stanford-parser-3.5.2-models.jar"
my_path_to_jar = stanford_parser_dir + "stanford-parser.jar"
如何在python中使用CoreNLP的共同引用解析?也许这对您有用?
如果没有,您可以尝试使用@Igor提到的将两者结合起来。您可以尝试在这个GitHub repo中实现的python包装器: 本回购协议包含两个主要文件: corenlp.py client.py 执行以下更改以使coreNLP正常工作:
如果不是corenlp\u路径:
corenlp_path=
jars=[“stanford-corenlp-3.4.1.jar”,
“stanford-corenlp-3.4.1-models.jar”,
“joda time.jar”,
“xom.jar”,
“jollyday.jar”]
python corenlp.py
python客户端.py
{
"coref": [[[["a Computer Scientist", 0, 4, 2, 5], ["John", 0, 0, 0, 1]], [["He", 1, 0, 0, 1], ["John", 0, 0, 0, 1]]]]
}
我已经在Ubuntu 16.04上试过了。使用java版本7或8 ,相对较新的包装器,可能适合您
假设文本是“巴拉克·奥巴马出生在夏威夷。他是总统。奥巴马于2008年当选。”
守则:
# coding=utf-8
import json
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP(r'G:\JavaLibraries\stanford-corenlp-full-2017-06-09', quiet=False)
props = {'annotators': 'coref', 'pipelineLanguage': 'en'}
text = 'Barack Obama was born in Hawaii. He is the president. Obama was elected in 2008.'
result = json.loads(nlp.annotate(text, properties=props))
num, mentions = result['corefs'].items()[0]
for mention in mentions:
print(mention)
上面的每一个“提及”都是这样的Python格言:
{
"id": 0,
"text": "Barack Obama",
"type": "PROPER",
"number": "SINGULAR",
"gender": "MALE",
"animacy": "ANIMATE",
"startIndex": 1,
"endIndex": 3,
"headIndex": 2,
"sentNum": 1,
"position": [
1,
1
],
"isRepresentativeMention": true
}
斯坦福大学的CoreNLP现在有一个叫做StanfordNLP的,你可以在 本机API仍然支持coref处理器,但您可以使用CoreNLPClient接口从Python调用“标准”CoreNLP(原始Java软件) 因此,在遵循设置Python包装器的说明之后,您可以获得如下所示的共同引用链:
从stanfordnlp.server导入CoreNLPClient
巴拉克出生在夏威夷。他的妻子米歇尔出生在米兰。他说她很聪明
打印(f“输入文本:{text}”)
#设置客户端
client=CoreNLPClient(属性={'annotators':'coref','coref.algorithm':'statistic'},超时=60000,内存=16G')
#将请求提交到服务器
ann=客户端。注释(文本)
mychains=list()
链=ann.corefChain
对于链中链:
mychain=list()
#把这条链子的每一个字都循环一遍
在链中提及。提及:
#获取该提及所在的句子,并获取属于该提及的单词
#(我们可以有多个词,例如,一个提词可以是像“他”这样的代词,也可以是像“他的妻子米歇尔”这样的复合名词)
words\u list=ann.station[title.sentenceIndex].token[title.beginIndex:title.endIndex]
#用上面提到的单词组成一个字符串
单词=''.join([x.word代表单词列表中的x])
mychain.append(单词)
mychains.append(mychain)
对于mychains中的链:
打印(“”.连接(链))
尝试过,但不起作用。Jython是python的java实现,我不能使用它,因为我的许多模块使用NLTK,我不能用java重新实现。还有其他建议吗?我们如何从您的JSON输出中创建{“coref”:[[[[“计算机科学家”,0,4,2,5],“John”,0,0,0,1],[[“He”,1,0,0,0,1],“John”,0,0,0,1]]}
?截至今天,该包装器的最新提交时间是2014年