我想制作一个日历应用程序,它比现有的那些更好地接受纯英文输入。我发现斯坦福的 NLP 看起来很酷,但我想知道它是否对此类任务有帮助。我找不到人们使用它做任何事情的例子。应用程序真的应该理解语言吗?似乎存在的自然英语日历正在寻找关键字/模式并尝试以这种方式解析,但我认为应用程序可以做得更好。
我真正的问题是:有人能告诉我如何找到使用 NLP 或不同(公开可用的)英语解析器来制作真正有用的应用程序的人的例子吗?
我正在尝试使用斯坦福 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) 我正在尝试进行回指解析,下面是我的代码。
首先,我导航到下载 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 论文中,我没有找到有关其预处理的详细信息。
我在一个python教程网站上找到了以下代码:
from nltk.tag import StanfordNERTagger
stanford_classifier = open("english.all.3class.distsim.crf.ser.gz")
stanford_ner_path = open("stanford-ner.jar")
st = StanfordNERTagger(stanford_classifier, stanford_ner_path)
Run Code Online (Sandbox Code Playgroud)
错误如下:
from nltk.tag import StanfordNERTagger
stanford_classifier = open("english.all.3class.distsim.crf.ser.gz")
stanford_ner_path = open("stanford-ner.jar")
st = StanfordNERTagger(stanford_classifier, stanford_ner_path)
Run Code Online (Sandbox Code Playgroud) 我试图从依赖解析器的输出中创建一棵树(嵌套字典)。这句话是“我在睡梦中射杀了一头大象”。我能够获得链接中所述的输出: How do I do dependency parsing in NLTK?
nsubj(shot-2, I-1)
det(elephant-4, an-3)
dobj(shot-2, elephant-4)
prep(shot-2, in-5)
poss(sleep-7, my-6)
pobj(in-5, sleep-7)
Run Code Online (Sandbox Code Playgroud)
为了将此元组列表转换为嵌套字典,我使用了以下链接: 如何将 python 元组列表转换为树?
def build_tree(list_of_tuples):
all_nodes = {n[2]:((n[0], n[1]),{}) for n in list_of_tuples}
root = {}
print all_nodes
for item in list_of_tuples:
rel, gov,dep = item
if gov is not 'ROOT':
all_nodes[gov][1][dep] = all_nodes[dep]
else:
root[dep] = all_nodes[dep]
return root
Run Code Online (Sandbox Code Playgroud)
输出如下:
{'shot': (('ROOT', 'ROOT'),
{'I': (('nsubj', 'shot'), {}),
'elephant': (('dobj', 'shot'), {'an': (('det', 'elephant'), {})}),
'sleep': (('nmod', 'shot'), …Run Code Online (Sandbox Code Playgroud) 我在尝试导入 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 ×8
python ×5
parsing ×2
python-3.x ×2
dictionary ×1
doc2vec ×1
file-io ×1
gensim ×1
linguistics ×1
nltk ×1
pos-tagger ×1
pycorenlp ×1
spacy ×1
text-mining ×1
typeerror ×1
word2vec ×1