2016-04-01 7 views
0

Entschuldigung im Voraus, da dies meine erste Frage ist. Ich benutze nltk, um eine Reihe von Tweets von einem csv zu token, die ich in ein df geladen habe. Die Tokenization funktioniert gut und gibt so etwas wie [[Mein, Onkel, ...]] in eine Zelle in einem df aus. Ich möchte dann einen POS-Tagger auf den Token-Text für die gesamte Spalte des df anwenden. Ich benutze den Code unten, um es zu tun. Die Linie, mit der ich Schwierigkeiten habe, ist df['tagged'] = df['tokenized'].apply(lambda row: [nltk.pos_tag(row) for item in row]). Ich weiß, dass ich auf das falsche Element (Zeile versus Element) iteriere, kann aber den richtigen Weg nicht finden. Der Code ist unten:NLTK auf Datenrahmen angewendet, wie man durch die Liste iteriert

import pandas as pd 
import numpy as np 
import nltk 
from nltk.tokenize import word_tokenize,wordpunct_tokenize 
from nltk.tag import pos_tag 
read_test = pd.read_csv("simontwittertest.csv") 
df = read_test 
df['tokenized'] = df['content'].apply(lambda row: [nltk.wordpunct_tokenize(row) for item in row]) 
df['tagged'] = df['tokenized'].apply(lambda row: [nltk.pos_tag(row) for item in row]) 
print(df['tagged'])` 

Aus Interesse habe ich einen kleinen Fehler mit pos_tag gefunden, die nur mit NLTK 3.1 nicht NLTK 3.2 (zumindest mit Python 2.7) Viele Thanks`

+0

Es könnte einfacher sein, zu arbeiten, sehen https://github.com/dato-code/SFrame/issues/16# Issue Comment-185326257 – alvas

+0

Vielen Dank. Ich werde es versuchen. –

Antwort

1

funktioniert Wenn Sie sich bewerben eine Lambda-Funktion auf eine Zeile, müssen Sie angeben, axis=1: auch mit `sframe`

df['tokenized'] = df['content'].apply(
    lambda row: [nltk.wordpunct_tokenize(row) for item in row], axis=1) 
df['tagged'] = df['tokenized'].apply(
    lambda row: [nltk.pos_tag(row) for item in row], axis=1) 
+0

Danke. Ich denke, ich habe das schon versucht, aber ich werde noch einmal gehen! –