2

私は Python を初めて使用し、解決できない問題に遭遇しました。

次の解析ツリーを JSON から次のリストにデコードしました。

>>> tree
['S', ['NP', ['DET', 'There']], ['S', ['VP', ['VERB', 'is'], ['VP', ['NP', ['DET', 'no'], ['NOUN', 'asbestos']], ['VP', ['PP', ['ADP', 'in'], ['NP', ['PRON', 'our'], ['NOUN', 'products']]], ['ADVP', ['ADV', 'now']]]]], ['.', '.']]]

再帰関数を使用して、終端の単語を含むリストを取得できました。

def explorer(tree):
    for sub in tree[1:]:
        if(type(sub) == str):
            allwords.append(sub)
        else:
            explorer(sub)

>>> allwords
['There', 'is', 'no', 'asbestos', 'in', 'our', 'products', 'no'.]

ここで、元のツリーでいくつかの基準を満たす単語を置き換える必要があるため、次のようになります。

['S', ['NP', ['DET', 'There']], ['S', ['VP', ['VERB', 'is'], ['VP', ['NP', ['DET', 'no'], ['NOUN', '_REPLACED_']], ['VP', ['PP', ['ADP', 'in'], ['NP', ['PRON', 'our'], ['NOUN', 'products']]], ['ADVP', ['ADV', 'now']]]]], ['.', '.']]]

次の関数を試しましたが、置換を上方に伝播できないため、常に同じ古い元のツリーを取得します。

def replacer(tree):
    string=[]
    for sub in tree[1:]:
        if(type(sub) == str):
            if #'condition is true':
                sub="_REPLACE_"
                return sub
            else: return sub    
        else:
            string.extend(replacer(sub))
    print(string)     

結果を達成する方法のヒントをいただければ幸いです。前もって感謝します。

4

3 に答える 3

2

これは、リスト内包表記を使用してこの種のことを行う方法の例です。わからない場合は、リスト内包表記はsomething = [explorer(x) for x in something]. それは再帰が起こっている場所でもあります。返されるのはまったく同じ構造のリストですが、すべてのエンドポイントに「行った」ので、チェックして置き換えることができます。私はいくつかの任意の置換を行いました。

>>> tree = ['S', ['NP', ['DET', 'There']], ['S', ['VP', ['VERB', 'is'], ['VP', ['NP', ['DET', 'no'], ['NOUN', 'asbestos']], ['VP', ['PP', ['ADP', 'in'], ['NP', ['PRON', 'our'], ['NOUN', 'products']]], ['ADVP', ['ADV', 'now']]]]], ['.', '.']]]
>>> def explorer(something):
        if type(something) == list:
            something = [explorer(x) for x in something]
        else:   # You may want to check other conditions here, like if it's a string
            if something == 'asbestos':
                something = 'Oh my'
            if something == 'S':
                something = 'Z'
        return something

>>> explorer(tree)
['Z', ['NP', ['DET', 'There']], ['Z', ['VP', ['VERB', 'is'], ['VP', ['NP', ['DET', 'no'], ['NOUN', 'Oh my']], ['VP', ['PP', ['ADP', 'in'], ['NP', ['PRON', 'our'], ['NOUN', 'products']]], ['ADVP', ['ADV', 'now']]]]], ['.', '.']]]
>>> 

あなたの言葉をもっと注意深く読んでいて、あることに気づきました。「置換を上方に伝播」できない理由は、ループが次のように構成されているためです。

for x in aList:
    if x = somethingSpecial:
        x = somethingElse

これは Python では機能しませんが、これは機能します。

for i,x in enumerate(aList):
    if x = somethingSpecial:
        aList[i] = somethingElse

aList、あなたが望むように変更されました。何をするかわからない場合enumerate()は、これをコピーして貼り付けてください:

aList = ['a','b','c']
for i,x in enumerate(aList):
    print(i,x)
于 2013-03-31T15:40:16.873 に答える