希腊文的无上下文语法

时间:2015-01-02 10:03:38

标签: python parsing nltk grammar

我想使用nltk为希腊语创建一个非常简单的无上下文语法。我在Windows上运行Python 2.7。

这是我的代码:

# -*- coding: utf-8 -*-
import nltk
grammar = nltk.CFG.fromstring("""
            S -> Verb Noun
            Verb -> a
            Noun -> b
            """)
a="κάνω"
b="ποδήλατο"

user_input = "κάνω ποδήλατο"

如何判断user_input语法是否正确?我试过了:

sent =  user_input.split()
parser = nltk.ChartParser(grammar)
for tree in parser.parse(sent):
        print tree

但是我在grammar.py附带的nltk文件(第632行)中出现以下错误:

ValueError: Grammar does not cover some of the input words: u"'\\xce\\xba\\xce\\xac\\xce\\xbd\\xcf\\x89', '\\xcf\\x80\\xce\\xbf\\xce\\xb4\\xce\\xae\\xce\\xbb\\xce\\xb1\\xcf\\x84\\xce\\xbf'".

我在使用for循环时只收到错误。在那之前我没有收到任何错误。所以我认为它是某种编码问题,我不知道如何克服。

1 个答案:

答案 0 :(得分:2)

首先,如果您使用nltk.CFG.fromstring,则必须将非终端(即词典中的单词)直接声明为CFG语法:

import nltk
grammar = nltk.CFG.fromstring(u"""
            S -> Verb Noun
            Verb -> "κάνω"
            Noun -> "ποδήλατο"
            """)
parser = nltk.ChartParser(grammar)
print parser.grammar()

[OUT]:

Grammar with 3 productions (start state = S)
    S -> Verb Noun
    Verb -> '\u03ba\u03ac\u03bd\u03c9'
    Noun -> '\u03c0\u03bf\u03b4\u03ae\u03bb\u03b1\u03c4\u03bf'

现在我们来看看您的user_input

>>> print ["κάνω ποδήλατο"]
['\xce\xba\xce\xac\xce\xbd\xcf\x89 \xcf\x80\xce\xbf\xce\xb4\xce\xae\xce\xbb\xce\xb1\xcf\x84\xce\xbf']

你意识到字符串在python 2.x中被读作字节码但在python 3.x中,默认情况下它将是utf8。现在看一下我们将它解码为utf8:

>>> print ["κάνω ποδήλατο".decode('utf8')]
[u'\u03ba\u03ac\u03bd\u03c9 \u03c0\u03bf\u03b4\u03ae\u03bb\u03b1\u03c4\u03bf']

请注意,u"κάνω ποδήλατο"与“κάνωποδήλατο”.decode('utf8')`在您对某个变量进行硬编码时显式解码字符串具有相同的效果。

现在看来如何用nltk.CFG.fromstring()读取语法:

# -*- coding: utf-8 -*-

import nltk
grammar = nltk.CFG.fromstring(u"""
            S -> Verb Noun
            Verb -> "κάνω"
            Noun -> "ποδήλατο"
            """)
parser = nltk.ChartParser(grammar)

user_input = u"κάνω ποδήλατο".split()
sent = user_input
parser = nltk.ChartParser(grammar)

for tree in parser.parse(sent):
    print tree

[OUT]:

(S (Verb \u03ba\u03b1\u03bd\u03c9) (Noun \u03c0\u03bf\u03b4\u03b7\u03bb\u03b1\u03c4\u03bf))

但是我不确定你是否看到了关于输出的奇怪的东西,它不完全是unicode而是unicode字节表示:

>>> x = '\u03ba\u03b1\u03bd\u03c9'
>>> print x
\u03ba\u03b1\u03bd\u03c9
>>> print x.decode('utf8')
\u03ba\u03b1\u03bd\u03c9
>>> print x.encode('utf8')
\u03ba\u03b1\u03bd\u03c9
>>> x = u'\u03ba\u03b1\u03bd\u03c9'
>>> print x
κανω

您需要执行此操作以检索原始unicode(感谢@Kasra,请参阅How to retrieve my unicode from the unicode byte representation ):

>>> s='\u03ba\u03b1\u03bd\u03c9'
>>> print unicode(s,'unicode_escape')
κανω