我需要使用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'
答案 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")
,你应该没问题(至少在找到下一个错误之前)。
您的其他问题:我认为您已走上正轨。如果您对依赖项感兴趣,那么实际上最好使用依赖项解析,就像您现在所做的那样。确实可以将成分解析转换为依赖(这已被证明),但它可能更多的工作。