Diego Expósito Gil diegoexpositogil@hotmail.com Manuel Fidalgo Sicilia Manuel_fidalgo@hotmail.com Diego Peces de Lucas pecesdelucas@hotmail.com Sistema categorizador de ofertas de empleo informáticas 1. Introducción La diversidad de las ofertas informáticas, dificulta su tratamiento mediante técnicas automáticas. Cada oferta tiene varios campos: fecha, idioma, lugar del trabajo, sector de la empresa y luego una serie de requisitos, bien sean personales (disponibilidad, experiencia, flexibilidad, idiomas,etc) o técnicos (redes, bases de datos, programación,etc). Esta información no siempre se encuentra de forma explícita, sino que se encuentra formando parte de un texto de longitud variable. Parece claro que sería útil construir un sistema que fuera capaz de recopilar ofertas de varios portales y sitios que ofrezcan ofertas, independientemente del formato; un texto que analizamos y tratamos para extraer el máximo de información útil para añadir a nuestra base de datos. Como primer paso, nos hemos planteado construir un pequeño sistema que tendrá tres funciones: - Categorizar el sector de la empresa que realiza la oferta: elegir de entre los diecinueve posibles sectores el que más se ajuste a la oferta. - Decidir si una oferta tiene como requisito técnico el conocimiento de java: puede ser java, j2ee, weblogic,etc. - Decidir también si una oferta nos pide Oracle: oracle, 8i,9i,etc Sin duda, la primera tarea es la más complicada, pues la clasificación del sector no es trivial, ya que puede haber varios sectores que nos pueden parecer apropiados para la oferta y el sector es exclusivo, es decir, cada oferta sólo puede pertenecer a un sector. Las otras dos tareas no deberían plantearnos problemas serios, puesto que se trata de que el sistema aprenda una serie de términos relacionados con el tema y decidir si hablan de java/oracle o no. Despúes de ver los resultados, podemos ver que son a nivel general satisfactorios, teniendo en cuenta la complejidad del asunto en que nos estamos moviendo 2. Problema La construcción de un sistema capaz de extraer información de distintas ofertas y almacenar esa información, implica tener una base de datos de ofertas con cierto volumen que puede sernos útil para varias cosas: ofrecer un sistema de búsqueda de empleo basado en las ofertas actuales, realizar un sistema que permita realizar consultas a nuestra base de datos y realizar informes del tipo: Cuál es el lenguaje de programación más demandado Cuál es el perfil de un analista de software?, etc. Así pues, tenemos dos puntos importantes a tratar: conseguir ofertas y tratar esas ofertas para su clasificación. En la actualidad hay varios portales que ofrecen ofertas personalizadas a sus usuarios en forma de correo electrónico (tecnobolsa 1, tecnojobs, infojobs). 1 www.tecnobolsa.com, www.tecnojobs.net, www.infojobs.net 1
Además existen motores de búsqueda como el whizbang job search engine[wjse01], capaz de recuperar datos sobre un tema específico con técnicas de inteligencia artificial. La idea es recorrer la web en busca de páginas que traten sobre un determinado tema para clasificarlas según su relevancia y almacenarlas en una base de datos. La segunda parte también es complicada y es en la que se basa este trabajo. No es fácil tratar ofertas que pueden variar cualitativamente entre unas y otras. Para la clasificación utilizaremos técnicas de procesamiento natural [FS01]. 3. Enfoque Para realizar el trabajo, partiremos de un conjunto de entrenamiento en el que tenemos las ofertas ya clasificadas según los tres criterios (java, oracle y sector), realizaremos la indexación de términos con la herramienta de recuperación de información de Mooney [MO01] y utilizaremos weka [WK01] para lanzar varios algoritmos de clasificación y contrastar resultados. Unos de los puntos más importantes es el hecho de tener un conjunto de entrenamiento, ya que no se ha encontrado ninguno ya hecho, nos hemos tenido que construir uno, a partir de 584 ofertas, que han sido clasificadas a mano de acuerdo con los tres criterios. Una vez que tenemos el conjunto de entrenamiento, vamos a realizar una indexación automática de los documentos para encontrar los términos relevantes de acuerdo al modelo del espacio vectorial [HL01] utilizando para ello también una lista de parada en español 2. Ahora es tiempo de crear un fichero.arff [WK02] para realizar las pruebas en weka. Las pruebas consisten en seleccionar distintos atributos y ejecutar varios algoritmos para observar con cuales obtenemos mejores resultados. 4. Experimentos Para realizar la categorización de los tres criterios señalados anteriormente, utilizaremos un método común: un conjunto de entrenamiento, una clasificación mediante varios algoritmos y una evaluación de los resultados obtenidos. Los algoritmos elegidos son: naivebayes, j48,smo,ibk(1),ibk(5),ibk(10). La calidad de los resultados obtenidos vendrá dada por la precisión conseguida en las distintas clasificaciones. -Java: aquí el conjunto de entrenamiento son las 584 ofertas, de las cuales 47 son de java y el resto no. Una vez realizada la indexación obtenemos 4084 términos relevantes, realizamos un ranking por ganancia de información y resulta que los términos que más casos separan son, por este orden: Info gain atributo 0.21397 java 0.11168 j 0.09345 ee 0.06686 html 0.03159 entornos 0.02952 desarrollo 2 http://www.snowball.tartarus.org/spanish/stemmer.html 2
0.02803 web 0.02558 xml 0.02549 flash 0.0253 jsp 0.0253 weblogic 0.01931 photoshop 0.01924 documentacion 0.0189 javascript Para realizar las pruebas, consideramos tres agresividades: agresividad 10 (aproximadamente el 10% 400 términos), agresividad 100 (1% 40 términos) y agresividad 100 (0,1% 4 términos). -agresividad 10: Los mejores resultados los obtenemos con el algoritmo j-48, acierta en un 97.9452% y falla en un 2.0548% (572 ejemplares clasificados correctamente de los 584). Con smo: 96.5753 % de acierto y 3.4247 % de fracaso (564 de 584). Observaciones: árbol generado con j48: java <= 0 aplicaciones <= 0: no (470.0/7.0) aplicaciones > 0 j <= 0: no (76.0/3.0) j > 0: si (6.0) java > 0: si (32.0/1.0) -agresividad 100: Aquí los mejores resultados los obtenemos con el algoritmo smo 97.4315 % aciertos y 2.5685 % de fallos (569 de 584). Con j48: 96.7466 % 3.2534 % (565 de 584) Observaciones: árbol generado con j48: java <= 0 web <= 0: no (490.0/9.0) web > 0 entornos <= 0 objetos <= 0: no (54.0/1.0) objetos > 0: si (3.0/1.0) entornos > 0: si (5.0/1.0) java > 0: si (32.0/1.0) Matriz de confusión de smo a b <-- classified as 32 15 a = si 0 537 b = no No clasifica ninguna oferta que no sea de java como java. -Agresividad 1000: Aquí se producen los mejores resultados, no hay ningún algoritmo que esté por debajo del 96% de acierto. El algoritmo que mayor número de aciertos consigue es Ibk con k = 5. Acierta en un 98.1164 %de los casos y falla en un 1.8836 % (573 de los 584 ejemplares). Con k = 2 también obtenemos buenos 97.774 % de aciertos y 3
2.226 % de fallos (571 de 584). Observaciones: Con j48 obtenemos una tasa de acierto de 97.089 % y el árbol generado es : java <= 0: no (552.0/16.0) java > 0: si (32.0/1.0) Clasificamos una oferta como perteneciente a la clase java si posee el término java. Conclusiones finales de la clasificación de java En general conseguimos buenos resultados con pocos términos términos: java, j, ee, html. En concreto obtenemos 98.1164% con ibk(2). Con el algoritmo j48 conseguimos buenos resultados con pocas reglas, con lo que podemos afirmar que simplemente debemos comprobar si las ofertas tienen ciertos términos para ser clasificados como java. -Oracle: el conjunto de entrenamiento está formado por 586 ofertas, 59 de las cuales son de oracle y el resto no. Al realizar la indexación obtenemos 4096 términos relevantes. Tras realizar el ranking por ganancia de información descubrimos los atributos con mayor poder de separación: Info gain: atributo 0.35432 oracle 0.01899 dba 0.01714 developer 0.01668 datos 0.01555 bases 0.01184 ee 0.01184 weblogic 0.01184 j 0.01138 corba 0.01138 developper 0.01138 bd 0.01138 incoporar 0.01138 asegurador 0.01138 composer 0.01138 ambito 0.01138 computing 0.01137 administracion Oracle También aquí hemos considerado tres tipo de pruebas: agresividad 10 (aproximadamente el 10% 400 términos), agresividad 100 (1% 40 términos) y agresividad 100 (0,1% 4 términos). -agresividad 10: Los mejores resultados los conseguimos con j48 98.2935 % de acierto y 1.7065 % de fallo(576 de 586). Con los demás algoritmos no conseguimos grandes resultados. Observaciones árbol de j48: oracle <= 0: no (523.0/4.0) oracle > 0 tecnologica <= 0: si (57.0/4.0) 4
tecnologica > 0 datos <= 2.312877: no (4.0) datos > 2.312877: si (2.0) -agresividad 100: Los resultados son en general mejores, aunque el mejor algoritmo, j48, pierde precisión (97.9522 % de acierto). Observaciones: el árbol que genera j48 se convierte en una simple regla de decisión: oracle <= 0: no (523.0/4.0) oracle > 0: si (63.0/8.0) -agresividad 1000: Nuevamente el algoritmo j48 es el mejor, con una tasa de acierto de 97.9522 % (574 de 586). Con el algoritmo IBK con k=10 también conseguimos buenos 97.4403 % de acierto. Observaciones: el algoritmo j48 consigue los mismos resultados que con agresividad 100 porque utiliza el mismo árbol. Conclusiones finales de la clasificación de Oracle: Igual que sucedía con la clasificación de java, podemos concluir que simplemente considerando la aparición de ciertos términos podemos considerar una oferta como perteneciente a oracle. -Sector Para la clasificación del sector hemos utilizado ficheros arff reducidos, hemos realizado una selección por info gain de los 40 mejores atributos. Sector administración (sector1ig.arff) En este sector sólo tenemos un ejemplar positivo frente a los 584 negativos. Todos los algoritmos probados clasifican todos los ejemplares como negativos, ya que ese ejemplar positivo es despreciable. Así, todos los algoritmos consiguen una precisión del 99.8291%. Al tener sólo un ejemplar positivo frente a los 584 negativos, no podemos utilizar matrices de coste porque la proporción de ejemplares positivos es demasiado pequeña. Sector alimentación (sector2ig.arff) En este sector tenemos 5 ejemplares positivos y 580 negativos. La proporción entre unos y otros es desmesurada. Primero utilizamos el algoritmo j-48 y observamos que nos pasa lo mismo que en el sector anterior, si suponemos todos los ejemplares como negativos, obtenemos una precisión del 99.1453 %. Ahora utilizamos un clasificador sensible al coste con j-48 para tratar de clasificar algunos ejemplares positivos como tales y no como negativos. La matriz de coste empleada es la siguiente: 0 x Donde x varía desde 1 a 100 Los resultados ahora no son mucho mejores, aunque conseguimos clasificar un ejemplar positivo como tal, consiguiendo una precisión del 99.3162 %. Sector comunicaciones (sector3ig.arff) Aquí tenemos 23 ejemplares positivos y 562 negativos. Utilizando j-48 conseguimos clasificar 2 de los primeros como positivos, con lo que volvemos a probar con matrices de costes. 5
Mediante este método conseguimos aumentar algunos ejemplos positivos, a costa de clasificar mal algunos negativos: 0 10 6 17 a = si 93.8462 % 19 543 b = no 4 19 a = si 96.2393 % 0 5 3 559 b = no 6 17 a = si 9 553 b = no 95.5556 % Sector construcción (sector4ig.arff) En este sector tenemos 55 ejemplares positivos y 530 negativos. Utilizando j-48 obtenemos un 90.5983 % aunque no clasifica bien ningún ejemplar positivo, por lo que utilizamos nuevamente matrices de costes. 10 45 a = si 90.0855 % 0 4 13 517 b = no 9 46 a = si 9 52 b = no 90.5983 % Sector distribución comercio (sector5ig.arff) Aquí tenemos 13 ejeplares positivos y 572 negativos. Utilizando j-48 conseguimos una precisión del 97.6068 %. 2 11 a = si 97.4359 % 4 568 b = no 0 2 2 11 a = si 97.7778 % 2 570 b = no Sector entidad financiera (sector6ig.arff) Aquí tenemos 7 ejeplares positivos y 578 negativos. Utilizando j-48 conseguimos una precisión del 98.6325 %. 0 10 2 5 a = si 98.6325 % 3 575 b = no 0 20 2 5 a = si 98.8034 % 2 576 b = no Sector formación (sector7ig.arff) Aquí tenemos 15 ejeplares positivos y 570 negativos. Utilizando j-48 conseguimos una precisión del 97.4359 %. 6
0 10 9 6 a = si 97.094 % 11 559 b = no 0 5 7 8 a = si 97.094 % 9 561 b = no 0 2 5 10 a = si 97.094 % 7 56 b = no Sector industrial (sector8ig.arff) Aquí tenemos 8 ejeplares positivos y 577 negativos. Utilizando j-48 conseguimos una precisión del 98.6325 %. 0 5 3 5 a = si 98.4615 % 4 573 b = no 0 7 2 6 a = si 98.4615 % 3 574 b = no Sector información (sector9ig.arff) En este sector sólo tenemos un ejemplar positivo frente a los 584 negativos. Todos los algoritmos probados clasifican todos los ejemplares como negativos, ya que ese ejemplar positivo es despreciable. Así, todos los algoritmos consiguen una precisión del 99.8291%. Al tener sólo un ejemplar positivo frente a los 584 negativos, no podemos utilizar matrices de coste porque la proporción de ejemplares positivos es demasiado pequeña. Sector informática (sector10ig.arff) Aquí tenemos 22 ejeplares positivos y 563 negativos. Utilizando j-48 conseguimos una precisión del 96.2393 %. 0 2 2 20 a = si 95.0427 % 9 554 b = no 5 17 a = si 94.0171 % 18 545 b = no Sector internet (sector11ig.arff) Aquí tenemos 22 ejeplares positivos y 563 negativos. Utilizando j-48 conseguimos una precisión del 96.5812 %, clasificando correctamente siete ejemplares positivos. 0 5 11 11 a = si 95.3846 % 7
16 547 b = no 0 2 9 13 a = si 9 554 b = no 96.2393 % Sector no figura (sector12ig.arff) Aquí tenemos 52 ejeplares positivos y 533 negativos. Utilizando j-48 conseguimos una precisión del 91.1111 %%. 0 2 4 48 a = si 89.9145 % 11 522 b = no 0 5 10 42 a = si 85.1282 % 45 488 b = no Sector publicidad (sector13ig.arff) En este sector sólo tenemos un ejemplar positivo frente a los 584 negativos. Todos los algoritmos probados clasifican todos los ejemplares como negativos, ya que ese ejemplar positivo es despreciable. Así, todos los algoritmos consiguen una precisión del 99.8291%. Al tener sólo un ejemplar positivo frente a los 584 negativos, no podemos utilizar matrices de coste porque la proporción de ejemplares positivos es demasiado pequeña. Sector farmacia (sector14ig.arff) En este sector sólo tenemos un ejemplar positivo frente a los 584 negativos. Todos los algoritmos probados clasifican todos los ejemplares como negativos, ya que ese ejemplar positivo es despreciable. Así, todos los algoritmos consiguen una precisión del 99.8291%. Al tener sólo un ejemplar positivo frente a los 584 negativos, no podemos utilizar matrices de coste porque la proporción de ejemplares positivos es demasiado pequeña. Sector seguros (sector15ig.arff) Aquí tenemos 4 ejeplares positivos y 581 negativos. Utilizando j-48 conseguimos una precisión del 99.4872 %. 0 15 4 0 a = si 99.6581 % 2 579 b = no 0 5 4 0 a = si 99.6581 % 2 579 b = no Sector consultoría no informática (sector16ig.arff) Aquí tenemos 9 ejeplares positivos y 576 negativos. Utilizando j-48 conseguimos una precisión del 98.4615 %. 8
0 10 0 9 a = si 97.4359 % 6 570 b = no 0 7 0 9 a = si 97.265 % 7 569 b = no 0 9 a = si 98.2906 % 1 575 b = no Sector servicios informáticos (sector17ig.arff) Aquí tenemos 337 ejeplares positivos y 248 negativos. Utilizando j-48 conseguimos una precisión del 76.0684 % 0 10 337 0 a = si 57.6068 % 248 0 b = no 337 0 a = si 57.6068 % 248 0 b = no 0 1 37 a = si 42.3932 % 1000 0 0 248 b = no 0 1 2 0 37 a = si 0 248 b = no 42.3932 % Sector tecnologia (sector18ig.arff) Aquí tenemos 5 ejeplares positivos y 580 negativos. Utilizando j-48 conseguimos una precisión del 99.1453 %. 0 20 1 4 a = si 99.3162 % 0 580 b = no 0 40 2 3 a = si 98.1197 % 8 572 b = no Sector tecnologia (sector19ig.arff) Aquí tenemos 4 ejeplares positivos y 581 negativos. Utilizando j-48 conseguimos una precisión del 99.3162 %. 0 10 1 3 a = si 99.1453 % 2 579 b = no 0 5 1 3 a = si 99.4872 % 9
0 581 b = no 5. Trabajo relacionado En la actualidad existe un motor de búsqueda de ofertas de empleo que emplea técnicas de recuperacion de informacion y se llama WhizBang. El sistema ha tenido bastante éxito y ha sido adquirido por una empresa de mayor envergadura con vistas a su explotación comercial. Nuestro trabajo desarrollado se basa simplemente en el análisis de las ofertas y no en buscar ofertas como en el caso de WhizBang. 6. Conclusiones y futuro trabajo El trabajo queda abierto al desarrollo y con expectativas de finalización, puesto que se encuentra enmarcado dentro de un proyecto informático real. 7. Bibliografía Apuntes de la asignatura PLN ftp://aurora.esi.uem.es/pub/asignaturas/ingenieriainformatica/segundociclo/quinto/pl N/index.html Tutorial weka www.cs.waikato.ac.nz/~ml/weka/tutorial.pdf 8. Referencias [WJSE01] www.inxight.com/whizbang/ http://webster.cs.uga.edu/~miller/semweb/whitepapers/whizbang.ppt [MO01] http://www.cs.utexas.edu/users/mooney/ [WK01] The University of Waikato, Machine Learning Software in Java. http://www.cs.waikato.ac.nz/ml/weka [HL01] Hull, J. J. and Y. Li, Word recognition decision selection using the vector space model for information retrieval, Second Annual Symposium on Document Analysis and Information Retrieval, Las Vegas, NV, Apr. 26-28, 1993. [WK02] Formato arff http://www.cs.waikato.ac.nz/~ml/weka/arff.html [FS01] Machine Learning in Automated Text Categorization FABRIZIO SEBASTIANI Consiglio Nazionale delle Ricerche, Italy 10
http://faure.iei.pi.cnr.it/~fabrizio/ 11