работает со встроенными кортежами / строками, python - PullRequest
2 голосов
/ 28 ноября 2010

говорят, что у меня есть теговый текст (слово, тег) в формате кортежа.я хочу преобразовать его в строку, чтобы внести некоторые изменения в теги.моя функция ниже видит только последнее предложение в тексте, я предполагаю, что есть некоторая очевидная и глупая ошибка, которую я не могу осознать, поэтому плз поможет заставить ее работать на весь текст.

>>> import nltk
>>> tpl = [[('This', 'V'), ('is', 'V'), ('one', 'NUM'), ('sentence', 'NN'), ('.', '.')], [('And', 'CNJ'), ('This', 'V'), ('is', 'V'), ('another', 'DET'), ('one', 'NUM')]]

def translate(tuple2string):
    for sent in tpl:
        t = ' '.join([nltk.tag.tuple2str(item) for item in sent])

>>> print t
    'And/CNJ This/V is/V another/DET one/NUM'

PS для техкому интересно, функция tuple2str описана здесь

РЕДАКТИРОВАТЬ: теперь я должен преобразовать ее обратно в кортеж, имеющий тот же формат.Как мне это сделать?

>>> [nltk.tag.str2tuple(item) for item in t.split()] 

приведенный выше конвертируется в целый кортеж, но мне нужен встроенный (такой же, как во входных данных (tpl))

EDIT2: ну, наверное, стоит опубликовать весь код:

def translate(tpl):
    t0 = [' '.join([nltk.tag.tuple2str(item) for item in sent]) for sent in tpl] 
    for t in t0: 
        t = re.sub(r'/NUM', '/N', t) 
        t = [nltk.tag.str2tuple(item) for item in t.split()] 
    print t

1 Ответ

3 голосов
/ 28 ноября 2010
>>> ' '.join(' '.join(nltk.tag.tuple2str(item) for item in sent) for sent in tpl)
'This/V is/V one/NUM sentence/NN ./. And/CNJ This/V is/V another/DET one/NUM'

EDIT:

Если вы хотите, чтобы это было обратимо, просто не выполняйте внешнее соединение.

>>> [' '.join([nltk.tag.tuple2str(item) for item in sent]) for sent in tpl]
['This/V is/V one/NUM sentence/NN ./.', 'And/CNJ This/V is/V another/DET one/NUM']

РЕДАКТИРОВАТЬ 2:

Я думал, мы уже прошли через это ...

>>> [[nltk.tag.str2tuple(re.sub('/NUM', '/N', w)) for w in s.split()] for s in t0]
[[('This', 'V'), ('is', 'V'), ('one', 'N'), ('sentence', 'NN'), ('.', '.')],
  [('And', 'CNJ'), ('This', 'V'), ('is', 'V'), ('another', 'DET'), ('one', 'N')]]

Разбить его на форму, не связанную со списком:

def translate(tpl):
    result = []
    t0 = [' '.join([nltk.tag.tuple2str(item) for item in sent]) for sent in tpl]
    for t in t0:
        t = re.sub(r'/NUM', '/N', t)
        t = [nltk.tag.str2tuple(item) for item in t.split()]
        result.append(t)
    return result
...