2014-11-27 2 views
1

У меня есть помеченный текст. Тег с меткой содержит некоторые неверные помеченные слова. Поэтому я сделал tagger правил для слов, которые оригинальный теггер не может пометить. И я хочу заменить в помеченном тексте только неправильные помеченные слова с правильным. формат маркированного текстаобновление помеченных слов в тексте

il/P ragazzo/V vuole/V andare/V a/P scuola/V` 

формат правильных тегов:

[(u'porta', 'NN'), (u'scuola', 'NN'), (u'ragazzo', 'NN')] 

И выход будет `

il/P ragazzo/NN vuole/V andare/V a/P scuola/NN` 

Я попытался создать два словаря: один для помеченного текста и один для правильных тегов, а затем заменяет значения, когда ключи одинаковы, но словарь не уважает исходный порядок текста, но дает мне выход в беспорядке. Может кто-то знает, как заменить неправильные помеченные слова в исходном тексте. Благодаря

ответ

0

Вы можете использовать nltk.str2tuple модуль для преобразования помеченной строки кортежей, а затем пройти через первый список и если у вас есть один и тот же элемент в первом элементе correct_tag_list затем выбрал этот пункт из correct_tag_list (k) еще выбрать этот элемент из самого первого списка (i,j):

>>> from nltk.tag.util import str2tuple 
>>> s1=[(unicode(i),j) for i,j in [str2tuple(i) for i in s.split()]] 
>>> l_first=[i[0] for i in l] 
>>> [tuple(k for k in l if i==k[0])[0] if i in l_first else (i,j) for i,j in s1] 
    [(u'il', 'P'), (u'ragazzo', 'NN'), (u'vuole', 'V'), (u'andare', 'V'), (u'a', 'P'), (u'scuola', 'NN')] 

Демонстрации:

>>> s="il/P ragazzo/V vuole/V andare/V a/P scuola/V" 
>>> l=[(u'porta', 'NN'), (u'scuola', 'NN'), (u'ragazzo', 'NN')] 
>>> from nltk.tag.util import str2tuple 
>>> [str2tuple(i) for i in s.split()] 
[('il', 'P'), ('ragazzo', 'V'), ('vuole', 'V'), ('andare', 'V'), ('a', 'P'), ('scuola', 'V')] 
>>> s1=[(unicode(i),j) for i,j in s1] 
>>> s1 
[(u'il', 'P'), (u'ragazzo', 'V'), (u'vuole', 'V'), (u'andare', 'V'), (u'a', 'P'), (u'scuola', 'V')] 
>>> l_first=[i[0] for i in l] 
>>> l_first 
[u'porta', u'scuola', u'ragazzo'] 
>>> [tuple(k for k in l if i==k[0])[0] if i in l_first else (i,j) for i,j in s1] 
[(u'il', 'P'), (u'ragazzo', 'NN'), (u'vuole', 'V'), (u'andare', 'V'), (u'a', 'P'), (u'scuola', 'NN')] 

Если вы не хотите, чтобы подать в суд nltk.str2tuple использовать новообращенную строку tupple со следующим кодом только с помощью split()

>>> [tuple(i.split('/')) for i in s.split()] 
[('il', 'P'), ('ragazzo', 'V'), ('vuole', 'V'), ('andare', 'V'), ('a', 'P'), ('scuola', 'V')] 
1

Вы можете использовать словарь для тегов, а затем преобразовать входной сигнал для вывода в цикле, сохраняя порядок:

input = 'hil/P ragazzo/V vuole/V andare/V a/P scuola/V' 
rules = [(u'porta', 'NN'), (u'scuola', 'NN'), (u'ragazzo', 'NN')] 

rules_dict = {rule[0]: rule[1] for rule in rules} 

parts = [] 
for token in input.split(): 
    word, type = token.split('/') 
    if word in rules_dict: 
     parts.append(word + '/' + rules_dict[word]) 
    else: 
     parts.append(token) 

output = ' '.join(parts) 
print(output) 
Смежные вопросы