Python Pandas NLTK Tokenize Column в Pandas Dataframe: ожидаемая строка или байтовоподобный объект - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий пример фрейма данных со столбцом 'problem_definition':

ID  problem_definition  
1   cat, dog fish
2   turtle; cat; fish fish
3   hello book fish 
4   dog hello fish cat

Я хочу слово tokenize столбца 'problem_definition'.

Ниже мой код:

from nltk.tokenize import sent_tokenize, word_tokenize 
import pandas as pd 

df = pd.read_csv('log_page_nlp_subset.csv')

df['problem_definition_tokenized'] = df['problem_definition'].apply(word_tokenize)

Приведенный выше код дает мне следующую ошибку:

TypeError: ожидаемая строка или байтовоподобный объект

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вероятно, в вашем фактическом df['TEXT'] есть объект, не похожий на строку (например, NaN), который не отображается в опубликованных вами данных.

Вот как вы можете это сделатьнайдите проблемные значения:

mask = [isinstance(item, (str, bytes)) for item in df['TEXT']]
print(df.loc[~mask])

Если вы хотите удалить эти строки, вы можете использовать

df = df.loc[mask]

или , так как PineNuts0 указывает на , весь столбецможет быть приведен к str dtype с использованием

df['TEXT'] = df['TEXT'].astype(str)

Например, если в df['TEXT'],

import pandas as pd
from nltk.tokenize import sent_tokenize, word_tokenize 

df = pd.DataFrame({'ID': [1, 2, 3, 4],
                   'TEXT': ['cat, dog fish',
                            'turtle; cat; fish fish',
                            'hello book fish',
                            np.nan]})
#    ID                    TEXT
# 0   1           cat, dog fish
# 1   2  turtle; cat; fish fish
# 2   3         hello book fish
# 3   4                     NaN

# df['TEXT'].apply(word_tokenize)
# TypeError: expected string or buffer


mask = [isinstance(item, (str, bytes)) for item in df['TEXT']]
df = df.loc[mask]
#    ID                    TEXT
# 0   1           cat, dog fish
# 1   2  turtle; cat; fish fish
# 2   3         hello book fish

есть значение NaN и теперь применяется word_tokenize, работает:

In [108]: df['TEXT'].apply(word_tokenize)
Out[108]: 
0                [cat, ,, dog, fish]
1    [turtle, ;, cat, ;, fish, fish]
2                [hello, book, fish]
Name: TEXT, dtype: object
0 голосов
/ 28 ноября 2018

Используйте lambda внутри apply:

df = pd.DataFrame({'TEXT':['cat, dog fish', 'turtle; cat; fish fish', 'hello book fish', 'dog hello fish cat']})
df

    TEXT
0   cat, dog fish
1   turtle; cat; fish fish
2   hello book fish
3   dog hello fish cat

df.TEXT.apply(lambda x: word_tokenize(x))

0                [cat, ,, dog, fish]
1    [turtle, ;, cat, ;, fish, fish]
2                [hello, book, fish]
3            [dog, hello, fish, cat]
Name: TEXT, dtype: object

Если вам также необходимо избежать пунктуации, используйте:

df.TEXT.apply(lambda x: RegexpTokenizer(r'\w+').tokenize(x))
0             [cat, dog, fish]
1    [turtle, cat, fish, fish]
2          [hello, book, fish]
3      [dog, hello, fish, cat]
Name: TEXT, dtype: object
...