Tengo un conjunto de datos con ~40 columnas, y estoy usando .apply(word_tokenize) en 5 de ellos así: df['token_column'] = df.column.apply(word_tokenize).

Me estoy poniendo un TypeError sólo para una de las columnas, vamos a llamar a este problem_column

TypeError: expected string or bytes-like object

Aquí está el error completo (despojado df y los nombres de columna, y pii), soy nuevo en Python y todavía estoy tratando de averiguar qué partes de los mensajes de error son relevantes:

TypeError                                 Traceback (most recent call last)
<ipython-input-51-22429aec3622> in <module>()
----> 1 df['token_column'] = df.problem_column.apply(word_tokenize)
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
2353             else:
2354                 values = self.asobject
-> 2355                 mapped = lib.map_infer(values, f, convert=convert_dtype)
2356 
2357         if len(mapped) and isinstance(mapped[0], Series):
pandas\_libs\src\inference.pyx in pandas._libs.lib.map_infer (pandas\_libs\lib.c:66440)()
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\__init__.py in word_tokenize(text, language, preserve_line)
128     :type preserver_line: bool
129     """
--> 130     sentences = [text] if preserve_line else sent_tokenize(text, language)
131     return [token for sent in sentences
132             for token in _treebank_word_tokenizer.tokenize(sent)]
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\__init__.py in sent_tokenize(text, language)
95     """
96     tokenizer = load('tokenizers/punkt/{0}.pickle'.format(language))
---> 97     return tokenizer.tokenize(text)
98 
99 # Standard word tokenizer.
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py in tokenize(self, text, realign_boundaries)
1233         Given a text, returns a list of the sentences in that text.
1234         """
-> 1235         return list(self.sentences_from_text(text, realign_boundaries))
1236 
1237     def debug_decisions(self, text):
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py in sentences_from_text(self, text, realign_boundaries)
1281         follows the period.
1282         """
-> 1283         return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)]
1284 
1285     def _slices_from_text(self, text):
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py in span_tokenize(self, text, realign_boundaries)
1272         if realign_boundaries:
1273             slices = self._realign_boundaries(text, slices)
-> 1274         return [(sl.start, sl.stop) for sl in slices]
1275 
1276     def sentences_from_text(self, text, realign_boundaries=True):
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py in <listcomp>(.0)
1272         if realign_boundaries:
1273             slices = self._realign_boundaries(text, slices)
-> 1274         return [(sl.start, sl.stop) for sl in slices]
1275 
1276     def sentences_from_text(self, text, realign_boundaries=True):
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py in _realign_boundaries(self, text, slices)
1312         """
1313         realign = 0
-> 1314         for sl1, sl2 in _pair_iter(slices):
1315             sl1 = slice(sl1.start + realign, sl1.stop)
1316             if not sl2:
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py in _pair_iter(it)
310     """
311     it = iter(it)
--> 312     prev = next(it)
313     for el in it:
314         yield (prev, el)
C:\Users\egagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\tokenize\punkt.py in _slices_from_text(self, text)
1285     def _slices_from_text(self, text):
1286         last_break = 0
-> 1287         for match in self._lang_vars.period_context_re().finditer(text):
1288             context = match.group() + match.group('after_tok')
1289             if self.text_contains_sentbreak(context):
TypeError: expected string or bytes-like object

El 5 columnas son todas de carácter/cadena (como se comprobó en el Servidor SQL, SAS, y el uso de .select_dtypes(include=[object])).

Para buena medida utilizada .to_string() para asegurarse de problem_column es realmente y verdaderamente no cualquier cosa, además de una cadena, pero me sigue apareciendo el error. Si yo proceso de las columnas por separado good_column1-good_column4 seguir trabajando y problem_column sigue generando el error.

He buscado en google de todo y aparte de eliminar cualquier números de la serie (que yo no puedo hacer, porque esas son significativas) no he encontrado ninguna correcciones adicionales.

  • Si tu pregunta era lo suficientemente contestada, usted puede aceptar la mayoría de responder de manera útil.
InformationsquelleAutor LMGagne | 2017-09-07

4 Comentarios

  1. 12

    El problema es que usted no tiene Ninguno (NA) tipos en el DF. Intente esto:

    df['label'].dropna(inplace=True)
    tokens = df['label'].apply(word_tokenize)
  2. 1

    Intentar

    from nltk.tokenize import word_tokenize as WordTokenizer
    def word_tokenizer(data, col):
    token=[]
    for item in data[col]:
    token.append(WordTokenizer(item))
    return token
    token = word_tokenizer(df, column)
    df. insert(index, 'token_column', token)
  3. 1

    Esto es lo que me consiguió el resultado deseado.

    def custom_tokenize(text):
    if not text:
    print('The text to be tokenized is a None type. Defaulting to blank string.')
    text = ''
    return word_tokenize(text)
    df['tokenized_column'] = df.column.apply(custom_tokenize)
  4. 0

    Que podría estar mostrando un error porque word_tokenize() sólo aceptará 1 cuerda en un tiempo. Puede crear un bucle a través de las cuerdas y, a continuación, convertir ella.

    Por ejemplo:

    text = "This is the first sentence. This is the second one. And this is the last one."
    sentences = sent_tokenize(text)
    words = [word_tokenize(sent) for sent in sentences]
    print(words)

Dejar respuesta

Please enter your comment!
Please enter your name here