Python 希腊语上下文无关语法

Python 希腊语上下文无关语法,python,parsing,nltk,grammar,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="ποδήλατο"

我想使用
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 = "κάνω ποδήλατο"
如何判断用户输入的
语法是否正确?我试过:

sent =  user_input.split()
parser = nltk.ChartParser(grammar)
for tree in parser.parse(sent):
        print tree
但是我得到以下错误,它发生在
nltk
附带的
grammar.py
文件(第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
循环时才会出现错误。在此之前,我没有收到任何错误。因此,我认为这是一种编码问题,我不知道如何克服。

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

import nltk
grammar = nltk.CFG.fromstring(u"""
            S -> Verb Noun
            Verb -> "κάνω"
            Noun -> "ποδήλατο"
            """)
parser = nltk.ChartParser(grammar)
print parser.grammar()
# -*- 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]:

Grammar with 3 productions (start state = S)
    S -> Verb Noun
    Verb -> '\u03ba\u03ac\u03bd\u03c9'
    Noun -> '\u03c0\u03bf\u03b4\u03ae\u03bb\u03b1\u03c4\u03bf'
(S (Verb \u03ba\u03b1\u03bd\u03c9) (Noun \u03c0\u03bf\u03b4\u03b7\u03bb\u03b1\u03c4\u03bf))
现在我们来看一下您的
用户输入:

>>> 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']
您知道,在Python2.x中,字符串被读取为字节码,但在Python3.x中,默认情况下它是utf8。现在,在我们将其解码为utf8时查看:

>>> print ["κάνω ποδήλατο".decode('utf8')]
[u'\u03ba\u03ac\u03bd\u03c9 \u03c0\u03bf\u03b4\u03ae\u03bb\u03b1\u03c4\u03bf']
请注意,
u“κάωποΔήλατο”
与“κάωάποΔολατο”具有相同的效果。在硬编码某些变量时显式解码字符串

现在,它看起来像是使用
nltk.CFG.fromstring()
读取语法的方式:

[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'
(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,请参阅 ):


它一直工作到我必须检索原始unicode为止。我使用升华文本3,我得到了UnicodeDeer错误。如果我在空闲状态下写代码,它会起作用。可能是因为默认编码。看看这个:。我假设输入数据将使用原始输入通过标准输入法输入。建议:使用python 3。你能从Sublime发布错误回溯吗?