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