【问题标题】:How can I reformat the output of the Malt Parser in NLTK?如何在 NLTK 中重新格式化 Malt Parser 的输出?
【发布时间】:2014-11-14 12:28:03
【问题描述】:

所以我终于弄清楚了如何使用“How to use malt parser in python nltk”的 NLTK 中提供的麦芽包装器,并且能够成功地对我的句子进行分块,但是我的句子以我不熟悉的格式出现。

例如解析“This is a sentence”返回:

>>> import nltk
>>> parser = nltk.parse.malt.MaltParser(working_dir="/path/to/dir",mco="engmalt.linear-1.7",additional_java_args=['-Xmx512m'])
>>> txt = "This is a test sentence"
>>> graph = parser.raw_parse(txt)
>>> graph.tree().pprint()
(This (sentence is a test))

解析更复杂的句子返回:

>>> import nltk
>>> parser = nltk.parse.malt.MaltParser(working_dir="/path/to/dir",mco="engmalt.linear-1.7",additional_java_args=['-Xmx512m'])
>>> txt = "A ceasefire for east Ukraine has been agreed during talks in Minsk."
>>> graph = parser.raw_parse(txt)
>>> graph.tree().pprint()
(agreed
   (ceasefire A (for (Ukraine east)))
   has
   been
   (during (talks (in Minsk)))
   .)

有人可以解释一下这个输出格式是什么,或者我可以如何解析它,使它看起来像原始句子:

(This (is a test sentence))
A (ceasefire (for (east Ukraine))) has been (agreed (during (talks (in Minsk))).)

如果有帮助,graph 是一个 nltk DependencyGraph,graph.tree() 是一个 nltk 树。

提前致谢。

【问题讨论】:

    标签: python parsing nlp nltk


    【解决方案1】:

    MaltParser 是一个数据驱动的“依赖解析”系统,可用于从树库数据中诱导解析模型,并使用诱导模型解析新数据。

    文件 engmalt.poly-1.7.mco 和 engmalt.linear-1.7.mco 包含使用 MaltParser 解析英文文本的单一麦芽配置。

    这两个模型的不同之处在于 engmalt.poly-1.7.mco 使用带有多项式内核的 SVM 进行分类,而 engmalt.linear-1.7.mco 使用线性 SVM。虽然后一种解析器速度更快,但前者需要更少的内存,并且两种模型的解析精度相似。还有我们的输出解析文本的编写方式。

    使用 engmalt.poly-1.7.mco,输出解析文本以依赖注释/依赖图表示,其中 engmalt.linear-1.7.mco 以线性方式表示。

    请遵循以下输出。希望这会有所帮助。

    使用 mco="engmalt.linear-1.7"

    >>> import nltk
    >>> parser = nltk.parse.malt.MaltParser(working_dir="/path/to/dir",mco="engmalt.linear-1.7",additional_java_args=['-Xmx512m'])
    >>> txt = "This is a test sentence"
    >>> graph = parser.raw_parse(txt)
    >>> graph.tree().pprint()
    (This (sentence is a test))
    

    使用 mco="engmalt.poly-1.7"

    >>> import nltk
    >>> parser = nltk.parse.malt.MaltParser(working_dir="/path/to/dir",mco="engmalt.poly-1.7",additional_java_args=['-Xmx512m'])
    >>> txt = "This is a test sentence"
    >>> graph = parser.raw_parse(txt)
    >>> graph.tree().pprint()
    (is This (a (sentence test)))
    

    对于您的新复杂句子,使用 mco="engmalt.linear-1.7"

    >>> import nltk
    >>> parser = nltk.parse.malt.MaltParser(working_dir="/path/to/dir",mco="engmalt.linear-1.7",additional_java_args=['-Xmx512m'])
    >>> txt = "A ceasefire for east Ukraine has been agreed during talks in Minsk."
    >>> graph = parser.raw_parse(txt)
    >>> graph.tree().pprint()
    (A\n  (agreed\n    (been ceasefire for east Ukraine has)\n    (during (Minsk talks in)))\n  .)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多