Estoy buscando una forma efectiva de construcción de un Término Matriz de Documentos en Python que se puede utilizar junto con datos adicionales.

Tengo algunos datos de texto con algunos otros atributos. Me gustaría correr algunos análisis sobre el texto y me gustaría ser capaz de correlacionar las características extraídas de texto (como word o tokens de LDA temas) con los otros atributos.

Mi plan era cargar los datos como los pandas marco de datos y, a continuación, cada respuesta va a representar un documento. Por desgracia, me encontré con un problema:

import pandas as pd
import nltk

pd.options.display.max_colwidth = 10000

txt_data = pd.read_csv("data_file.csv",sep="|")
txt = str(txt_data.comment)
len(txt)
Out[7]: 71581 

txt = nltk.word_tokenize(txt)
txt = nltk.Text(txt)
txt.count("the")
Out[10]: 45

txt_lines = []
f = open("txt_lines_only.txt")
for line in f:
    txt_lines.append(line)

txt = str(txt_lines)
len(txt)
Out[14]: 1668813

txt = nltk.word_tokenize(txt)
txt = nltk.Text(txt)
txt.count("the")
Out[17]: 10086

Tenga en cuenta que en ambos casos, el texto fue procesada de tal manera que sólo la nada, sino espacios, letras y ,.?! fue eliminado (por simplicidad).

Como se puede ver a los pandas de campo convertido en una cadena devuelve menos partidos y la longitud de la cadena es también más corto.

Hay alguna forma de mejorar el código anterior?

También, str(x) crea 1 gran cadena de los comentarios mientras [str(x) for x in txt_data.comment] crea un objeto de la lista que no puede ser rota en una bolsa de palabras. ¿Cuál es la mejor manera de producir un nltk.Text objeto que retendrá el documento de índices? En otras palabras, estoy buscando una manera de crear un Término Matriz de Documentos, R es el equivalente de TermDocumentMatrix() de tm paquete.

Muchas gracias.

  • no está seguro de cuál es su pregunta, pero hay otras bibliotecas de la PNL que podría ser de ayuda para usted, las bibliotecas como patrón, textblob, C&C, si usted llegó a un callejón sin salida, usted puede probar esas bibliotecas, cada uno de ellos tiene su propia ventaja sobre los demás.
  • Gracias @mid , soy consciente de gensim, pero nunca he oído hablar de textblob anteriormente, de hecho parecen útiles, aunque! Soy bastante nuevo en Python (por lo general trabajan en I) y yo realmente duda de que he llegado a un punto muerto con NLTK, teniendo en cuenta lo popular que es el paquete, estoy seguro de que me estoy perdiendo algo.
InformationsquelleAutor IVR | 2016-01-14

1 Comentario

  1. 11

    La ventaja de utilizar un pandas DataFrame sería aplicar el nltk funcionalidad a cada row así:

    word_file = "/usr/share/dict/words"
    words = open(word_file).read().splitlines()[10:50]
    random_word_list = [[' '.join(np.random.choice(words, size=1000, replace=True))] for i in range(50)]
    
    df = pd.DataFrame(random_word_list, columns=['text'])
    df.head()
    
                                                    text
    0  Aaru Aaronic abandonable abandonedly abaction ...
    1  abampere abampere abacus aback abalone abactor...
    2  abaisance abalienate abandonedly abaff abacina...
    3  Ababdeh abalone abac abaiser abandonable abact...
    4  abandonable abandon aba abaiser abaft Abama ab...
    
    len(df)
    
    50
    
    txt = df.text.apply(word_tokenize)
    txt.head()
    
    0    [Aaru, Aaronic, abandonable, abandonedly, abac...
    1    [abampere, abampere, abacus, aback, abalone, a...
    2    [abaisance, abalienate, abandonedly, abaff, ab...
    3    [Ababdeh, abalone, abac, abaiser, abandonable,...
    4    [abandonable, abandon, aba, abaiser, abaft, Ab...
    
    txt.apply(len)
    
    0     1000
    1     1000
    2     1000
    3     1000
    4     1000
    ....
    44    1000
    45    1000
    46    1000
    47    1000
    48    1000
    49    1000
    Name: text, dtype: int64

    Como resultado, se obtiene la .count() para cada row entrada:

    txt = txt.apply(lambda x: nltk.Text(x).count('abac'))
    txt.head()
    
    0    27
    1    24
    2    17
    3    25
    4    32

    Usted puede, a continuación, suma el resultado de usar:

    txt.sum()
    
    1239
    • Gracias @Stefan, que resuelve mi problema, sin embargo, txt objeto es todavía un pandas marco de datos de objeto, lo que significa que sólo puedo usar algunos de NLTK funciones mediante apply, map o for bucles. Sin embargo, si quiero hacer algo como nltk.Text(txt).concordance("the") voy a ejecutar en problemas. Para resolver este todavía se necesita para convertir el texto completo de la variable en una cadena y como vimos en el primer ejemplo, esa cadena de caracteres será truncado por alguna razón. Alguna idea sobre cómo superar esto? Muchas gracias!
    • Puede convertir toda la text column en una lista de palabras de uso: [t for t in df.text.tolist()] – ya sea después de la creación o después de .tokenize().

Dejar respuesta

Please enter your comment!
Please enter your name here