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

时间:2015-05-26 09:24:44

标签: python-2.7 nlp nltk

我需要使用NLTK从原始文本中获取句子中的依赖关系。 据我所知,stanford解析器允许我们只创建树,但是如何从这棵树中得到依赖关系我没有发现(也许它可能,也许不是) 所以我开始使用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'

1 个答案:

答案 0 :(得分:0)

您使用不合适的参数实例化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标记器;这是一个默认的基于RegEx的标记器,用于在该类中硬编码的英语。)

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

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