我正在尝试使用斯坦福 CoreNLP 库从自然语言内容中提取信息。
我的目标是从句子中提取“主语-动作-宾语”对(简化)。
作为一个例子,请考虑以下句子:
约翰·史密斯午餐只吃一个苹果和一个香蕉。他正在节食,他的母亲告诉他,午餐少吃一点会非常健康。约翰一点也不喜欢,但由于他对饮食非常严格,所以他不想停止。
从这句话我想得到如下结果:
一个人会怎样做呢?
或者更具体地说:如何解析依赖树(或更适合的树?)以获得上面指定的结果?
任何给定此任务的提示、资源或代码片段都将受到高度赞赏。
旁注:我设法用它们的代表性提及替换共指,然后将he和更改his为相应的实体(在这种情况下为约翰·史密斯)。
我目前使用 spaCy 来遍历依赖树并生成实体。
nlp = get_spacy_model(detect_lang(unicode_text))
doc = nlp(unicode_text)
entities = set()
for sentence in doc.sents:
# traverse tree picking up entities
for token in sentence.subtree:
## pick entitites using some pre-defined rules
entities.discard('')
return entities
Run Code Online (Sandbox Code Playgroud)
spaCy 有什么好的 Java 替代品吗?
我正在寻找像 spaCy 那样生成依赖树的库。
编辑:
我研究了斯坦福解析器。但是,它生成了以下解析树:
ROOT
|
NP
_______________|_________
| NP
| _________|___
| | PP
| | ________|___
NP NP | NP
____|__________ | | _______|____
DT JJ JJ NN NNS IN DT JJ NN
| | | | …Run Code Online (Sandbox Code Playgroud) 有没有办法将Google或Glove 的预训练向量(模型)(例如GoogleNews-vectors-negative300.bin.gz)加载到 spark 中并执行诸如从 spark 提供的 findSynonyms 之类的操作?还是我需要从头开始加载和操作?
在这篇文章中,在 Spark 中加载 Word2Vec 模型,Tom Lous 建议将 bin 文件转换为 txt 并从那里开始,我已经这样做了..但接下来是什么?
在我昨天发布的一个问题中,我得到了一个答案,即 Parquet 格式的模型可以在 spark 中加载,因此我发布这个问题是为了确保没有其他选择。
我正在尝试从 stanford corenlp python 包运行 corenlp.py 。当我运行它时,我收到此错误:
Traceback (most recent call last):
File "corenlp.py", line 592, in <module>
main()
File "corenlp.py", line 580, in main
nlp = StanfordCoreNLP(options.corenlp, properties=options.properties, serving=True)
File "corenlp.py", line 435, in __init__
self._spawn_corenlp()
File "corenlp.py", line 424, in _spawn_corenlp
self.corenlp.expect("\nNLP> ")
File "/Library/Python/2.7/site-packages/pexpect-4.2.1-py2.7.egg/pexpect/spawnbase.py", line 321, in expect
timeout, searchwindowsize, async)
File "/Library/Python/2.7/site-packages/pexpect-4.2.1-py2.7.egg/pexpect/spawnbase.py", line 345, in expect_list
return exp.expect_loop(timeout)
File "/Library/Python/2.7/site-packages/pexpect-4.2.1-py2.7.egg/pexpect/expect.py", line 105, in expect_loop
return self.eof(e)
File "/Library/Python/2.7/site-packages/pexpect-4.2.1-py2.7.egg/pexpect/expect.py", line 50, in eof
raise EOF(msg)
pexpect.exceptions.EOF: End …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照此处的示例通过 NLTK 使用斯坦福解析器。
我遵循示例的前两行(带有必要的导入)
from nltk.parse.corenlp import CoreNLPDependencyParser
dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
parse, = dep_parser.raw_parse('The quick brown fox jumps over the lazy dog.')
Run Code Online (Sandbox Code Playgroud)
但我收到一条错误消息:
[...] Failed to establish a new connection: [Errno 61] Connection refused"
Run Code Online (Sandbox Code Playgroud)
我意识到尝试连接到作为构造函数输入给出的 url 一定是一个问题。
dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
Run Code Online (Sandbox Code Playgroud)
如果不是这个,我应该连接到哪个网址?如果这是正确的,问题是什么?
似乎格式是,对于每一行,字符串就像“字号……”。所以很容易分裂。但是当我用下面的脚本分割它们时
import numpy as np
def loadGloveModel(gloveFile):
print "Loading Glove Model"
f = open(gloveFile,'r')
model = {}
for line in f:
splitLine = line.split()
word = splitLine[0]
embedding = np.array([float(val) for val in splitLine[1:]])
model[word] = embedding
print "Done.",len(model)," words loaded!"
return model
Run Code Online (Sandbox Code Playgroud)
我加载手套 840B 300d.txt。但是得到错误,我打印了我得到的 splitLine
['contact', 'name@domain.com', '0.016426', '0.13728', '0.18781', '0.75784', '0.44012', '0.096794' ... ]
Run Code Online (Sandbox Code Playgroud)
或者
['.', '.', '.', '.', '0.033459', '-0.085658', '0.27155', ...]
Run Code Online (Sandbox Code Playgroud)
请注意,此脚本在 glove.6b.* 中运行良好
我正在尝试进行回指解析,下面是我的代码。
首先,我导航到下载 stanford 模块的文件夹。然后我在命令提示符下运行命令来初始化 stanford nlp 模块
java -mx4g -cp "*;stanford-corenlp-full-2017-06-09/*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000
Run Code Online (Sandbox Code Playgroud)
之后我在 Python 中执行以下代码
from pycorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('http://localhost:9000')
Run Code Online (Sandbox Code Playgroud)
我想换句Tom is a smart boy. He know a lot of thing.成Tom is a smart boy. Tom know a lot of thing.并没有教程或在Python提供任何帮助。
我所能做的就是通过以下 Python 代码进行注释
共指解析
output = nlp.annotate(sentence, properties={'annotators':'dcoref','outputFormat':'json','ner.useSUTime':'false'})
Run Code Online (Sandbox Code Playgroud)
并通过解析 coref
coreferences = output['corefs']
Run Code Online (Sandbox Code Playgroud)
我低于 JSON
coreferences
{u'1': [{u'animacy': u'ANIMATE',
u'endIndex': 2,
u'gender': u'MALE',
u'headIndex': 1,
u'id': 1,
u'isRepresentativeMention': True, …Run Code Online (Sandbox Code Playgroud) 一些关于词和文档嵌入主题的论文(word2vec、doc2vec)提到他们使用斯坦福 CoreNLP 框架来标记/词形还原/词性标记输入的词/句子:
语料库使用斯坦福 CoreNLP (Manning et al., 2014) 进行词形还原和 POS 标记,并且每个标记都被替换为其引理和词性标记
( http://www.ep.liu.se/ecp/131/039/ecp17131039.pdf )
对于预处理,我们使用斯坦福 CoreNLP 对单词进行标记和小写
( https://arxiv.org/pdf/1607.05368.pdf )
所以我的问题是:
为什么第一篇论文应用 POS 标签?然后每个令牌会被替换为类似的东西{lemma}_{POS},整个东西用来训练模型吗?还是标签用于过滤令牌?例如,gensims WikiCorpus 默认应用词形还原,然后只保留几种类型的词性(动词、名词等)并去除其余部分。那么推荐的方式是什么?
在我看来,第二篇论文中的引述就像他们只是将单词分开然后小写。这也是我在使用维基语料库之前第一次尝试的。在我看来,这应该为文档嵌入提供更好的结果,因为大多数 POS 类型都有助于句子的含义。我对吗?
在最初的 doc2vec 论文中,我没有找到有关其预处理的详细信息。
我在尝试导入 StanfordNER Tagger 以用于 NER 时遇到了一些问题。这是我的代码(从这里的其他帖子中提取了部分代码):
import os
def install_java():
!apt-get install -y openjdk-8-jdk-headless -qq > /dev/null
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
!java -version
install_java()
!pip install StanfordCoreNLP
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('stanford-corenlp', lang='en', memory='4g')
Run Code Online (Sandbox Code Playgroud)
我得到的错误突出显示了告诉我的最后一行代码:
OSError: stanford-corenlp is not a directory.
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很棒!
编辑:这是另一行对我有用的代码。对于 StanfordNERTagger 中的内容,将这些文件加载到 Colab 中并提供路径名。对我最初提出的问题做同样的事情。为我工作。
from nltk.tag import StanfordNERTagger
from nltk.tokenize import word_tokenize
st = StanfordNERTagger('/content/english.muc.7class.distsim.crf.ser.gz',
'/content/stanford-ner.jar',
encoding='utf-8')
text = 'While in France, Christine Lagarde discussed short-term stimulus efforts in a recent interview with the Wall Street …Run Code Online (Sandbox Code Playgroud) 我想用代词替换句子中的名词。我将使用它为 NLP 任务创建数据集。例如,如果我的句子是 -->
“杰克和瑞恩是朋友。杰克也是米歇尔的朋友。”
然后我想用“他”替换第二个杰克(斜体和粗体)。我已经完成了词性标注以在我的句子中找到名词。但我不知道如何从这里开始。如果我有一个可以使用的所有可能代词的列表,是否有一个语料库或系统可以告诉我最适合这个词的代词?
stanford-nlp ×10
nlp ×7
python ×6
word2vec ×3
apache-spark ×1
doc2vec ×1
gensim ×1
linguistics ×1
nltk ×1
pexpect ×1
pos-tagger ×1
pycorenlp ×1
python-3.x ×1
scala ×1
spacy ×1
text-mining ×1