2013-05-02 3 views
0

NLTK의 파스 트리 객체에서 잎의 값을 변경하고 싶습니다. 다음 코드를 사용합니다.NLTK의 잎 값 변경

t = Tree(line) 
chomsky_normal_form(t, horzMarkov=2, vertMarkov=1, childChar = "|", parentChar = "^") 
print t 

for leaf in t.leaves(): 
    if leaf==k[0][1]: 
     leaf = "newValue" 
print t 

이제 두 개의 'print t'가 동일한 트리 출력을 제공합니다. 이런 식으로 리프에 값을 설정할 수 있다고 생각했지만 잘못된 것 같습니다. 잎의 값을 업데이트하려면 어떻게해야합니까? 각 잎의 클래스는 str입니다. 그래서 그것들을 변경할 수는 있지만 그것은 트리의 객체를 업데이트하는 것처럼 보이지 않습니다.

+0

나는 str 개체가 파이썬에서는 쓸모가 없기 때문에 그렇게 생각한다. 그러나 그것을 바꾸기 위해 할 수있는 방법이 있습니까? –

+0

이것은 문자열이 불변이기 때문에가 아니라 '='는 내용이 아닌 '이름'(변수)'leaf'에 할당되어 있기 때문이 아닙니다. –

+0

글쎄, 파이썬은 제 첫 언어가 아닙니다. 내용을 변경하여 내용을 변경하는 방법을 설명해 주실 수 있습니까? –

답변

1

Tree에 대한 이전 경험이 없으며 클래스 설명서에서 나뭇잎을 변경하는 확실한 방법을 제안하지 않았습니다. 그러나, 나뭇잎 메서드에 대해 source을 보면, 그것은 목록의 옷을 입은 형태 인 것처럼 보입니다. 잠깐의 콘솔에서와 바이올린, 나는 이것이 당신이 올바른 방향으로 움직이고 있다고 생각 :

>>> t = Tree("(s (dp (d the) (np dog)) (vp (v chased) (dp (d the) (np cat))))") 
>>> t.leaves() 
['the', 'dog', 'chased', 'the', 'cat'] 
>>> t[0][0][0] = "newValue" 
>>> t.leaves() 
['newValue', 'dog', 'chased', 'the', 'cat'] 
+0

감사합니다. 그것은 올바른 방향 (내가 처음에 피하려고했던 것)으로 나를 움직였습니다. 이를 변경할 수있는 방법은 노드를 직접 참조하여 트리 객체에 액세스하는 것입니다. 그리고 그것은 leaves() 메소드로는 할 수 없습니다. 나는 나무를 횡단하고 적절한 표범을 찾기 위해 일과를 만들었다. –

2

당신은 treepositions('leaves') (docs)는 나무와 변화 잎의 위치를 ​​얻기 위해 사용할 수 그것은 당신의 나무에 직접.

t = Tree(line) 
chomsky_normal_form(t, horzMarkov=2, vertMarkov=1, childChar = "|", parentChar = "^") 

for leafPos in t.treepositions('leaves'): 
    if t[leafPos] == k[0][1]: 
     t[leafPos] = "newValue" 
print t