Windows10下Jupyter Notebook中Stanford CoreNLPDependencyParser运行失败求助
解决Stanford CoreNLPDependencyParser报错问题及替代RDF三元组提取方案
看起来你在Windows 10的Jupyter Notebook里用NLTK调用Stanford CoreNLP做RDF三元组提取时踩了不少坑,我来帮你一步步解决这些问题,同时也给你几个更省心的替代方案——毕竟parse.triples()才是你的核心需求对吧?
一、先解决Stanford CoreNLP的两个报错问题
1. 解决TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'
这个错误大概率是版本不兼容或者路径指定方式错误导致的。NLTK的CoreNLPServer在单独指定单个jar和model文件时,容易出现版本检测逻辑失效(返回None),进而触发这个比较错误。
正确的做法是直接指定包含所有Stanford CoreNLP jar文件的目录,让NLTK自动加载所需的jar:
步骤:
- 先下载对应版本的Stanford CoreNLP压缩包(建议用4.x版本,比如4.5.4,和最新NLTK兼容性更好),解压到一个无空格的路径,比如
C:\stanford-corenlp-4.5.4 - 确保解压后的目录里包含主jar(
stanford-corenlp-4.5.4.jar)和英文模型jar(stanford-corenlp-4.5.4-models-english.jar)
示例代码:
from nltk.parse import CoreNLPDependencyParser from nltk.parse.corenlp import CoreNLPServer # Windows路径用原始字符串避免转义问题 corenlp_dir = r"C:\stanford-corenlp-4.5.4" # 启动服务器,直接指定目录即可 server = CoreNLPServer( corenlp_path=corenlp_dir, port=9000, timeout=15000 # 给长句子留足够解析时间 ) server.start() # 连接到本地服务器初始化解析器 parser = CoreNLPDependencyParser(url='http://localhost:9000') # 测试解析并提取三元组 test_sentence = "Apple was founded by Steve Jobs in California." parse_result, = parser.raw_parse(test_sentence) triples = parse_result.triples() print(list(triples)) # 用完记得关闭服务器 server.stop()
2. 解决LookupError找不到jar文件的问题
如果你已经用find_jars_within_path检测到jar,但依然报错,可能是这几个原因:
- 路径包含空格:比如
C:\Program Files\...,Windows下带空格的路径容易让Java程序识别失败,换个无空格的路径 - 路径转义错误:记得用原始字符串(加
r前缀)或者双反斜杠,比如r"C:\xxx"而不是C:\xxx - 缺失关键jar:确保主jar和英文模型jar都在指定目录里,少任何一个都会触发找不到的错误
二、更简便的替代方案(不用折腾Java jar)
如果你实在不想和Stanford的jar文件较劲,推荐两个更省心的方案,同样能生成可调用triples()方法的依赖树:
方案1:用spaCy + NLTK DependencyGraph
spaCy是Python生态里最易用的NLP库之一,配置简单,不需要额外Java环境:
安装依赖:
pip install spacy python -m spacy download en_core_web_sm
示例代码:
import spacy from nltk import DependencyGraph # 加载spaCy英文模型 nlp = spacy.load("en_core_web_sm") def spacy_to_nltk_dep_graph(spacy_doc): """把spaCy的解析结果转成NLTK DependencyGraph格式""" dep_lines = [ "# sent_id = 1", f"# text = {spacy_doc.text}" ] for token in spacy_doc: # 按CoNLL-U格式生成每行数据 line = "{0}\t{1}\t{2}\t{3}\t{4}\t_\t{5}\t{6}\t_\t_".format( token.i + 1, token.text, token.lemma_, token.pos_, token.tag_, token.head.i + 1 if token.head != token else 0, token.dep_ ) dep_lines.append(line) return DependencyGraph("\n".join(dep_lines)) # 测试提取三元组 test_sentence = "The quick brown fox jumps over the lazy dog." doc = nlp(test_sentence) dep_graph = spacy_to_nltk_dep_graph(doc) triples = dep_graph.triples() print(list(triples))
方案2:用Stanza(斯坦福官方Python接口)
Stanza是斯坦福团队推出的Python版CoreNLP,完全不需要手动下载jar,配置更友好:
安装依赖:
pip install stanza
下载英文模型(第一次运行执行):
import stanza stanza.download('en')
示例代码:
import stanza from nltk import DependencyGraph # 初始化Stanza Pipeline,只加载需要的处理器 nlp = stanza.Pipeline('en', processors='tokenize,mwt,pos,lemma,depparse') def stanza_to_nltk_dep_graph(stanza_doc): """把Stanza的解析结果转成NLTK DependencyGraph格式""" sentence = stanza_doc.sentences[0] dep_lines = [ "# sent_id = 1", f"# text = {sentence.text}" ] for token in sentence.words: head = int(token.head) if token.head != '0' else 0 line = "{0}\t{1}\t{2}\t{3}\t{4}\t_\t{5}\t{6}\t_\t_".format( token.id, token.text, token.lemma, token.upos, token.xpos, head, token.deprel ) dep_lines.append(line) return DependencyGraph("\n".join(dep_lines)) # 测试提取三元组 test_sentence = "Google acquired DeepMind in 2014." doc = nlp(test_sentence) dep_graph = stanza_to_nltk_dep_graph(doc) triples = dep_graph.triples() print(list(triples))
内容的提问来源于stack exchange,提问作者moses51
相关产品推荐
相关产品推荐

