2017-01-16 2 views
8

В ситуациях, когда вы хотите POS тег столбца текста, хранящийся в панде dataframe с 1 предложениями на подряд большинство реализаций на SO использовать применить методКак применять pos_tag_sents() для панд dataframe эффективно

dfData['POSTags']= dfData['SourceText'].apply(
       lamda row: [pos_tag(word_tokenize(row) for item in row]) 

Документация NLTK recommends using the pos_tag_sents() для эффективной маркировки более одного предложения.

ли, что относится к этому примеру, и если так будет код столь же просто, как изменение pso_tag к pos_tag_sents или же NLTK означают текстовые источники пунктов

Как уже упоминалось в комментариях pos_tag_sents() направлена ​​на снижение нагрузок на наставнику каждый раз , но проблема в том, как это сделать и все еще производить столбец в кадре данных панд?

Link to Sample Dataset 20kRows

+0

Сколько у вас строк? – alvas

+0

20 000 строк будут числом строк – mobcdi

+0

Это не проблема. Просто извлеките столбец в виде списка строк, обработайте его, а затем добавьте в столбец обратно в dataframe. – alvas

ответ

5

ввода

$ cat test.csv 
ID,Task,label,Text 
1,Collect Information,no response,cozily married practical athletics Mr. Brown flat 
2,New Credit,no response,active married expensive soccer Mr. Chang flat 
3,Collect Information,response,healthy single expensive badminton Mrs. Green flat 
4,Collect Information,response,cozily married practical soccer Mr. Brown hierachical 
5,Collect Information,response,cozily single practical badminton Mr. Brown flat 

TL; DR

>>> from nltk import word_tokenize, pos_tag, pos_tag_sents 
>>> import pandas as pd 
>>> df = pd.read_csv('test.csv', sep=',') 
>>> df['Text'] 
0 cozily married practical athletics Mr. Brown flat 
1  active married expensive soccer Mr. Chang flat 
2 healthy single expensive badminton Mrs. Green ... 
3 cozily married practical soccer Mr. Brown hier... 
4  cozily single practical badminton Mr. Brown flat 
Name: Text, dtype: object 
>>> texts = df['Text'].tolist() 
>>> tagged_texts = pos_tag_sents(map(word_tokenize, texts)) 
>>> tagged_texts 
[[('cozily', 'RB'), ('married', 'JJ'), ('practical', 'JJ'), ('athletics', 'NNS'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('flat', 'JJ')], [('active', 'JJ'), ('married', 'VBD'), ('expensive', 'JJ'), ('soccer', 'NN'), ('Mr.', 'NNP'), ('Chang', 'NNP'), ('flat', 'JJ')], [('healthy', 'JJ'), ('single', 'JJ'), ('expensive', 'JJ'), ('badminton', 'NN'), ('Mrs.', 'NNP'), ('Green', 'NNP'), ('flat', 'JJ')], [('cozily', 'RB'), ('married', 'JJ'), ('practical', 'JJ'), ('soccer', 'NN'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('hierachical', 'JJ')], [('cozily', 'RB'), ('single', 'JJ'), ('practical', 'JJ'), ('badminton', 'NN'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('flat', 'JJ')]] 

>>> df['POS'] = tagged_texts 
>>> df 
    ID     Task  label \ 
0 1 Collect Information no response 
1 2   New Credit no response 
2 3 Collect Information  response 
3 4 Collect Information  response 
4 5 Collect Information  response 

               Text \ 
0 cozily married practical athletics Mr. Brown flat 
1  active married expensive soccer Mr. Chang flat 
2 healthy single expensive badminton Mrs. Green ... 
3 cozily married practical soccer Mr. Brown hier... 
4 cozily single practical badminton Mr. Brown flat 

               POS 
0 [(cozily, RB), (married, JJ), (practical, JJ),... 
1 [(active, JJ), (married, VBD), (expensive, JJ)... 
2 [(healthy, JJ), (single, JJ), (expensive, JJ),... 
3 [(cozily, RB), (married, JJ), (practical, JJ),... 
4 [(cozily, RB), (single, JJ), (practical, JJ), ... 

В Лонга:

Во-первых, вы можете извлечь Text столбец в списке строки:

texts = df['Text'].tolist() 

Затем вы можете применить word_tokenize функцию:

map(word_tokenize, texts) 

Заметьте, что, @ Boud предложил почти то же самое, используя df.apply:

df['Text'].apply(word_tokenize) 

Тогда вы дамп токенизированный текст в список списка строки:

df['Text'].apply(word_tokenize).tolist() 

Затем вы можете использовать pos_tag_sents:

pos_tag_sents(df['Text'].apply(word_tokenize).tolist()) 

Затем добавьте столбец обратно в DataFrame:

df['POS'] = pos_tag_sents(df['Text'].apply(word_tokenize).tolist()) 
2

Применяя pos_tag на каждой строке, модель перцептрон будет загружен каждый раз (дорогостоящей операцией, так как он считывает с диска рассол).

Если вы приобрели все строки и отправили их pos_tag_sents (что принимает list(list(str))), модель загружается один раз и используется для всех.

См. source.

+0

. Можете ли вы предоставить пример использования 'pos_tag_sents()' с столбцом dataframe pandas в качестве источника и в целом чтобы вывод и помеченный вывод находились в одной строке? – mobcdi

+0

Я бы колол в темноте, так как я не знаком с Пандами. Возможно, что-то вроде 'pos_tag_sents (map (word_tokenize, dfData ['SourceText']. Values ​​())). –

2

Присвоить это ваш новый столбец вместо:

dfData['POSTags'] = pos_tag_sents(dfData['SourceText'].apply(word_tokenize).tolist()) 
Смежные вопросы