簡體   English   中英

希臘語的無上下文語法

[英]Context-free grammar for Greek

我想使用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文件(行632),附帶nltk

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 ,則必須聲明非終結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,請參見如何從unicode字節表示中檢索我的unicode ):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM