Reducción del espacio de características para la predicción de la etiqueta -- python campo con machine-learning campo con scikit-learn campo con feature-extraction campo con tf-idf camp Relacionados El problema

Feature space reduction for tag prediction


6
vote

problema

Español

Estoy escribiendo un módulo ML (Python) para predecir las etiquetas para una pregunta de StackOverFlow (Tag + Body). Mi corpus es de alrededor de 5 millones de preguntas con título, cuerpo y etiquetas para cada uno. Estoy dividiendo esto 3: 2 por entrenamiento y prueba. Estoy plagado por el maldición de dimensionalidad .


Trabajo hecho

  1. preprocesamiento: eliminación de marcas, eliminación de marcas, eliminación de caracteres especial y algunos bits y piezas. Tienda en MySQL. Esto casi mita el tamaño de los datos de prueba.
  2. ngrama Association: para Cada Unigram y Bigram en el título y el cuerpo de cada una pregunta , mantengo una lista de Las etiquetas asociadas. Almacenar en Redis. Esto se traduce en aproximadamente un millón de unicramas únicos y 20 millones de bigrams únicos, cada uno con una lista correspondiente de frecuencias de etiquetas. Ex.

      "continuous integration": {"ci":42, "jenkins":15, "windows":1, "django":1, ....}   

Nota: Hay 2 problemas aquí: a) No todos los unicramas y los bigrams son importantes y, b) no todas las etiquetas asociadas con Una ngrama es importante, aunque esto no significa que las etiquetas con frecuencia 1 son todo equivalentes o se pueden quitar al azar. El número de etiquetas asociadas con una nggrama determinada se ejecuta fácilmente en los miles, la mayoría de ellos no relacionados e irrelevantes.

  1. tfidf: Para ayudar a seleccionar qué ngramas para mantener, calculé la puntuación de TFIDF para todo el cuerpo para cada unicrame y bigram y almacenamos los valores de IDF correspondientes con las etiquetas asociadas. Ex.

      "continuous integration": {"ci":42, "jenkins":15, ...., "__idf__":7.2123}   

    Las puntuaciones de TFIDF se almacenan en un documentxfeature sparse.csr_matrix , y no estoy seguro de cómo puedo aprovechar eso en este momento. (Se genera por FIT_TRANSFORM () )


Preguntas

  1. ¿Cómo puedo usar estos datos procesados ​​para reducir el tamaño de mi conjunto de características? He leído sobre SVD y PCA, pero los ejemplos siempre hablan de un conjunto de documentos y un vocabulario. No estoy seguro de dónde pueden entrar las etiquetas de mi conjunto. Además, la forma en que se almacenan mis datos (Redis + Matriz escasa), es difícil usar un módulo ya implementado (Sklearn, NLTK etc) para esta tarea.
  2. Una vez que se reduce el conjunto de características, la forma en que he planeado usarlo es el siguiente:

    • preprocesa los datos de prueba.
    • Encuentra los unicramas y los bigrams.
    • para los almacenados en Redis, encuentre las etiquetas BEST-K correspondientes
    • aplicar algún tipo de peso para el título y el texto del cuerpo
    • Aparte de esto, también podría buscar coincidencias exactas de etiquetas conocidas en el documento. EX, si se produce "ruby-on-rays" en el título / cuerpo, entonces es una alta probabilidad de que también sea una etiqueta relevante.
    • Además, para las etiquetas predichas con una alta probabilidad, podría aprovechar un gráfico de etiquetas (un gráfico no dirigido con las etiquetas que frecuentemente ocurren juntos con bordes ponderados entre ellos) para predecir más etiquetas.

    ¿Hay alguna sugerencia sobre cómo mejorar esto? ¿Puede un clasificador a través?


Nota a pie de página

Tengo una máquina RAM de 16 gb, 16GB. El servidor Redis-Server (que me moveré a una máquina diferente) se almacena en RAM y es ~ 10 GB. Todas las tareas mencionadas anteriormente (aparte de TFIDF) se realizan en paralelo con los grupos de Ipython.

Original en ingles

I am writing a ML module (python) to predict tags for a stackoverflow question (tag + body). My corpus is of around 5 million questions with title, body and tags for each. I'm splitting this 3:2 for training and testing. I'm plagued by the curse of dimensionality.


Work Done

  1. Pre-processing: markup removal, stopword removal, special character removal and a few bits and pieces. Store into MySQL. This almost halves the size of the test data.
  2. ngram association: for each unigram and bigram in the title and the body of each question, I maintain a list of the associated tags. Store into redis. This results in about a million unique unigrams and 20 million unique bigrams, each with a corresponding list of tag frequencies. Ex.

    "continuous integration": {"ci":42, "jenkins":15, "windows":1, "django":1, ....} 

Note: There are 2 problems here: a) Not all unigrams and bigrams are important and, b) not all tags associated with a ngram are important, although this doesn't mean that tags with frequency 1 are all equivalent or can be haphazardly removed. The number of tags associated with a given ngram easily runs into the thousands - most of them unrelated and irrelevant.

  1. tfidf: to aid in selecting which ngrams to keep, I calculated the tfidf score for the entire corpus for each unigram and bigram and stored the corresponding idf values with associated tags. Ex.

    "continuous integration": {"ci":42, "jenkins":15, ...., "__idf__":7.2123} 

    The tfidf scores are stored in a documentxfeature sparse.csr_matrix, and I'm not sure how I can leverage that at the moment. (it is generated by fit_transform())


Questions

  1. How can I use this processed data to reduce the size of my feature set? I've read about SVD and PCA but the examples always talk about a set of documents and a vocabulary. I'm not sure where the tags from my set can come in. Also, the way my data is stored (redis + sparse matrix), it is difficult to use an already implemented module (sklearn, nltk etc) for this task.
  2. Once the feature set is reduced, the way I have planned to use it is as follows:

    • Preprocess the test data.
    • Find the unigrams and bigrams.
    • For the ones stored in redis, find the corresponding best-k tags
    • Apply some kind of weight for the title and body text
    • Apart from this I might also search for exact known tag matches in the document. Ex, if "ruby-on-rails" occurs in the title/body then its a high probability that it's also a relevant tag.
    • Also, for tags predicted with a high probability, I might leverage a tag graph (a undirected graph with tags frequently occurring together having weighted edges between them) to predict more tags.

    Are there any suggestions on how to improve upon this? Can a classifier come in handy?


Footnote

I've a 16-core, 16GB RAM machine. The redis-server (which I'll move to a different machine) is stored in RAM and is ~10GB. All the tasks mentioned above (apart from tfidf) are done in parallel using ipython clusters.

              
   
   

Lista de respuestas

1
 
vote

Utilice la API pública de dandelion , este es un Demo .
Extrae conceptos de un texto, por lo que, para reducir la dimentención, puede usar esos conceptos, en lugar del paradigma de la bolsa de la palabra.

 

Use the public Api of Dandelion, this is a demo.
It extracts concepts from a text, so, in order to reduce dimentionality, you could use those concepts, instead of the bag-of-word paradigm.

 
 
0
 
vote

Un enfoque estadístico de referencia que trataría esto como un problema de clasificación. Las características son bolsas de palabras procesadas por un clasificador máximo de entropía como Mallet http: //mallet.cs. umass.edu/classification.php . Maxent (también conocido como regresión logística) es bueno para manejar grandes espacios de características. Tome la probabilidad asociada con cada etiqueta (es decir, las etiquetas de la clase) y elija algún umbral de decisión que le brinde una compensación de precisión / recuperación que funciona para su proyecto. Parte de la documentación de Mallet incluso menciona la clasificación de los temas, que es muy similar a lo que está tratando de hacer.

Las preguntas abiertas son lo bien que Mallet maneja el tamaño de sus datos (que no es tan grande) y si esta herramienta en particular es un inicio no iniciador con la pila de tecnología que mencionó. Es posible que pueda entrenar fuera de línea (descarga la base de datos de Reddis a un archivo de texto en el formato de funciones de Mallet) y ejecute el modelo aprendido de Mallet en Python. Evaluar un modelo maxent es simple. Si desea permanecer en Python y esto sea más automatizado, hay implementaciones maxent con base en Python en NLTK y probablemente en Scikit-Learn. Este enfoque no está en todo el estado de la técnica, pero funcionará bien y será una línea de base decente con la que comparará métodos más complicados.

 

A baseline statistical approach would treat this as a classification problem. Features are bags-of-words processed by a maximum entropy classifier like Mallet http://mallet.cs.umass.edu/classification.php. Maxent (aka logistic regression) is good at handling large feature spaces. Take the probability associated with each each tag (i.e., the class labels) and choose some decision threshold that gives you a precision/recall tradeoff that works for your project. Some of the Mallet documentation even mentions topic classification, which is very similar to what you are trying to do.

The open questions are how well Mallet handles the size of your data (which isn't that big) and whether this particular tool is a non-starter with the technology stack you mentioned. You might be able to train offline (dump the reddis database to a text file in Mallet's feature format) and run the Mallet-learned model in Python. Evaluating a maxent model is simple. If you want to stay in Python and have this be more automated, there are Python-based maxent implementations in NLTK and probably in scikit-learn. This approach is not at all state-of-the-art, but it'll work okay and be a decent baseline with which to compare more complicated methods.

 
 

Relacionados problema

0  ¿Cómo dar más pesos a ciertas palabras en el modelo TF-IDF?  ( How to give more weights to certain words in tf idf model ) 
Para empezar, puedo estar ladrando el árbol equivocado, ya que soy muy nuevo en ML en general, así que por favor soplete conmigo (y me ilumina si es así:). ...

0  Uso de Lucene / Mahout para encontrar términos definitorios en grupos de documentos predefinidos  ( Using lucene mahout to find defining terms in predefined document groups ) 
Tengo un conjunto de documentos que se han dividido en categorías buenas y malas. Quiero poder predecir a qué categoría se caerán nuevos documentos. Una cosa ...

-1  ¿Cómo concatenar dos vectores de TF-IDF, así como otras características que se pueden introducir en un modelo?  ( How to concatenate two tf idf vectors as well as other features that can be fed ) 
La solución que encontré que funciona en mi caso se publica a continuación. Espero que esto ayude a alguien. ¿Cómo concatizaría la producción de TF-IDF crea...

3  Algoritmo de SmallTalk y TF-FDI  ( Smalltalk and tf idf algorithm ) 
¿Puede alguien mostrar una implementación simple o un ejemplo de uso de un algoritmo de TF-IDF en SmallTalk para el procesamiento de lenguaje natural? He enco...

0  (TF-IDF) Cómo devolver el artículo relacionado con cinco después de calcular la similitud de coseno  ( Tf idfhow to return the five related article after calculating cosine similari ) 
Recibo un conteo de datos sample_df (4 columnas: paper_id , title , resumen , body_text ). Extrajo la columna abstracta (~ 1000 palabras por resumen) y ...

0  ¿Cómo devolver el número de palabras en un documento resultante para calcular el TF  ( How do i return the number of words in a resulting document to calculate the tf ) 
Me han establecido el desafío de crear un motor de búsqueda de archivos de texto básico en PHP en un tiempo muy limitado, ¡teniendo poco a ningún conocimiento...

0  PY4JJAVAERROR: Se produjo un error al llamar a O288.FIT  ( Py4jjavaerror an error occurred while calling o288 fit ) 
Mientras ejecuta un código TFIDF de muestra de la documentación SPROP 2.2.0, aquí está el enlace: https://spark.apache.org/docs/2.2.0/ml-features.html Est...

0  Cómo encontrar la frecuencia a plazo de un conjunto particular de etiquetas en un documento  ( How to find term frequency of a particular sets of tags in a document ) 
¿Cómo puedo encontrar la frecuencia de cada una de estas anotaciones? Autor, año, Lang y también, las frecuencias de aparición de sus unicamos, bi-gramos, tri...

33  ¿Cómo calculo la similitud cosida de dos vectores?  ( How do i calculate the cosine similarity of two vectors ) 
¿Cómo puedo encontrar la similitud cosida entre los vectores? Necesito encontrar la similitud para medir la relación entre dos líneas de texto. Por ejempl...

5  ¿Cómo hago la clasificación utilizando TFidFVectorizer más metadatos en la práctica?  ( How do i do classification using tfidfvectorizer plus metadata in practice ) 
Estoy usando tratando de clasificar algunos documentos en dos clases, en las que uso TFidFvectorizer como una técnica de extracción de características. Los ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos