NLTK 从原始文本中获取依赖关系

NLTK getting dependencies from raw text

我需要使用 NLTK 从原始文本中获取句子中的依赖关系。 据我所知,斯坦福解析器允许我们只创建树,但是我没有找到如何从这棵树中获取句子中的依赖关系(也许是可能的,也许不是) 所以我开始使用 MaltParser。这是我正在使用的和平密码:

import os
from nltk.parse.stanford import StanfordParser
from nltk.tokenize import sent_tokenize
from nltk.parse.dependencygraph import DependencyGraph
from nltk.parse.malt import MaltParser


os.environ['JAVAHOME'] = r"C:\Program Files (x86)\Java\jre1.8.0_45\bin\java.exe"
os.environ['MALT_PARSER'] = r"C:\maltparser-1.8.1"

maltParser = MaltParser(r"C:\maltparser-1.8.1\engmalt.poly-1.7.mco")

class Parser(object):
    @staticmethod
    def Parse (text):
        rawSentences = sent_tokenize(text)
        treeSentencesStanford = stanfordParser.raw_parse_sents(rawSentences)

        a=maltParser.raw_parse(rawSentences[0])

但最后一行抛出异常“'str' 对象没有属性 'tag'”

changing the code above like this:
rawSentences = sent_tokenize(text)
        treeSentencesStanford = stanfordParser.raw_parse_sents(rawSentences)

        splitedSentences = []
        for sentence in rawSentences:
            splitedSentence = word_tokenize(sentence)
            splitedSentences.append(splitedSentence)


        a=maltParser.parse_sents(splitedSentences)

抛出相同的异常。

所以,我做错了什么。 总的来说:我将以正确的方式获取这样的依赖项:http://www.nltk.org/images/depgraph0.png(但我需要从代码中访问这些依赖项)


Traceback (most recent call last):
  File "E:\Google drive\Python multi tries\Python multi tries\Parser.py", line 51, in <module>
    Parser.Parse("Some random sentence. Hopefully it will be parsed.")
  File "E:\Google drive\Python multi tries\Python multi tries\Parser.py", line 32, in Parse
    a=maltParser.parse_sents(splitedSentences)
  File "C:\Python27\lib\site-packages\nltk-3.0.1-py2.7.egg\nltk\parse\malt.py", line 113, in parse_sents
    tagged_sentences = [self.tagger.tag(sentence) for sentence in sentences]
AttributeError: 'str' object has no attribute 'tag'

您正在使用不合适的参数实例化 MaltParser

运行 help(MaltParser) 给出以下信息:

Help on class MaltParser in module nltk.parse.malt:

class MaltParser(nltk.parse.api.ParserI)
 |  Method resolution order:
 |      MaltParser
 |      nltk.parse.api.ParserI
 |      __builtin__.object
 |  
 |  Methods defined here:
 |  
 |  __init__(self, tagger=None, mco=None, working_dir=None, additional_java_args=None)
 |      An interface for parsing with the Malt Parser.
 |      
 |      :param mco: The name of the pre-trained model. If provided, training
 |          will not be required, and MaltParser will use the model file in
 |          ${working_dir}/${mco}.mco.
 |      :type mco: str
...

因此,当您调用 maltParser = MaltParser(r"C:\maltparser-1.8.1\engmalt.poly-1.7.mco") 时,关键字参数 tagger 将设置为预训练模型的路径。 不幸的是,这个论点没有记录在案,但显然它是一个 PoS 标记器,从检查源代码可以看出。

(您不必指定 PoS 标注器;在 class 中硬编码了一个默认的基于 RegEx 的英语标注器。)

所以将您的代码更改为 maltParser = MaltParser(mco=r"C:\maltparser-1.8.1\engmalt.poly-1.7.mco"),您应该没问题(至少在您发现下一个错误之前)。

您的其他问题:我认为您的方向是正确的。如果您对依赖项感兴趣,最好实际使用依赖项解析,就像您现在所做的那样。确实可以将组成解析转换为依赖关系(这已被证明),但可能需要更多工作。