Как применить функцию POS-тега к строке в предложении из другого столбца панд - PullRequest
0 голосов
/ 28 апреля 2018

Как использовать POS-тег для одного слова из другого столбца с помощью Pandas?

Например, у меня есть:

col1      col2
aaa1      AAa1 is a great friend
abb2      abb2 is a very good friend

Я хочу вывести:

NNP is a great friend
NN is a very good friend

Я пытаюсь:

from nltk import pos_tag
columns = ['col1', 'col2']
data = pd.read_csv('data.csv', delimiter='\t', names=columns)
data["col2"] = data.apply(lambda x: x["col1"].replace(x["col1"], pos_tag([x["col2"], x["col1"]])[1][1]), axis=1)

Но это не работает и не игнорируйте регистр букв. Мой col1 только в нижнем регистре, в col2 у меня есть строчные и прописные слова. Как применить повторный суб-модуль? Я хочу использовать его для каждой строки (около 4 миллионов строк)

Edit: Если я попытаюсь использовать:

data["col2"] = data.apply(lambda x: re.sub(x["col1"], pos_tag([x["col1"].lower(), x["col1"].lower()]), x["col2"], flags=re.I), axis=1)

Это не работает. Потому что я хочу вывод с оригинальным регистром. Это моя целевая проблема -> Я хочу заменить действительно строку на NNP и NN для классификатора SVM.

Вы знаете, как это сделать?

1 Ответ

0 голосов
/ 28 апреля 2018

Простая функция может сделать эту задачу. Вы можете сделать так:

## import libraries
from nltk import word_tokenize, pos_tag, pos_tag_sents

## tag the sentece
df['col2'] = df['col2'].apply(word_tokenize).apply(pos_tag)

## this function does the magic 
def get_vals(lst):
    op = [] 
    for i, v in enumerate(lst):
        if i == 0:
            op.append(v[1])
        else:
            op.append(v[0])
    return ' '.join(op)

## apply the function
df['col2'] = df['col2'].apply(get_vals)

print(df)

   col1                      col2
0  aaa1     NNP is a great friend
1  abb2  NN is a very good friend

Обновленное решение:

Это решение подходит для замены строки в любом месте ее POS-тегом.

df = pd.DataFrame({'col1':['aaa1','abb2','mtmb2','mmm2','bb2'],
                   'col2':['AAa1 is a great friend','abb2 is a very good friend','MTMB2 is a my sentence','Your MmM2 is my sentence','Your sentence is bb2']})

## import libraries
from nltk import word_tokenize, pos_tag, pos_tag_sents

## tag the sentece
df['col2'] = df['col2'].str.lower().apply(word_tokenize).apply(pos_tag)
vals = df['col1'].tolist()

## this function does the magic 
def get_vals(lst):
    op = [] 
    for i, v in enumerate(lst):
        if v[0] in vals:
            op.append(v[1])
        else:
            op.append(v[0])

    return ' '.join(op)

## apply the function
df['col3'] = df['col2'].apply(get_vals)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...