sklearn machine learning example español cross python scikit-learn word-sense-disambiguation

python - machine - Implementar clasificador de vecinos K y SVM lineal en scikit-learn para la desambiguación del sentido de la palabra



machine learning python español pdf (2)

Los problemas de Machine Learning son un tipo de tareas de optimización en las que no se tiene un algoritmo predefinido para todos, sino que se busca el mejor resultado utilizando diferentes enfoques, parámetros y preprocesamiento de datos. Así que tienes toda la razón desde la tarea más sencilla: tomar solo una palabra y varios sentidos.

Pero no estoy seguro de cómo construir el vector de características y la etiqueta para cada uno.

Puede tomar solo estos valores como componentes vectoriales. Enumere palabras vectoriales y escriba números de esa palabra en cada texto. Si la palabra está ausente, ponga el valor vacío. He modificado ligeramente tu ejemplo para aclarar la idea:

vocab_38201= { "although": 1, "back": 1, "bend": 1, "bicycl": 1, "correct": 1, "dig": 1, "general": 1, "handlebar": 1, "hefti": 1, "lever": 1, "nt": 2, "quit": 1, "rear": 1, "spade": 1, "sprung": 1, "step": 1, "type": 1, "use": 1, "wo": 1 } vocab_38202 = { "caus": 1, "ear": 1, "energi": 1, "experi": 1, "inner": 1, "light": 1, "nervous": 1, "part": 1, "qualiti": 1, "reach": 1, "receptor": 2, "retin": 1, "sensori": 1, "stimul": 2, "system": 2, "upon": 2, "wo": 1 ### added so they have at least one common word }

Vamos a encubrirlo para incluir el vector. Enumere toda la palabra y marque cuántas veces esta palabra está en el vocabulario.

from collections import defaultdict words = [] def get_components(vect_dict): vect_components = defaultdict(int) for word, num in vect_dict.items(): try: ind = words.index(word) except ValueError: ind = len(words) words.append(word) vect_components[ind] += num return vect_components # vect_comps_38201 = get_components(vocab_38201) vect_comps_38202 = get_components(vocab_38202)

Miremos:

>>> print(vect_comps_38201) defaultdict(<class ''int''>, {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 2, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1}) >>> print(vect_comps_38202) defaultdict(<class ''int''>, {32: 1, 33: 2, 34: 1, 7: 1, 19: 2, 20: 2, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 2, 28: 1, 29: 1, 30: 1, 31: 1}) >>> vect_38201=[vect_comps_38201.get(i,0) for i in range(len(words))] >>> print(vect_38201) [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] >>> vect_38202=[vect_comps_38202.get(i,0) for i in range(len(words))] >>> print(vect_38202) [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1]

Estos vect_38201 y vect38202 son vectores que puede usar en el modelo de adaptación:

from sklearn.svm import SVC X = [vect_38201, vect_38202] y = [38201, 38202] clf = SVC() clf.fit(X, y) clf.predict([[0, 0, 1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1]])

Salida:

array([38202])

Por supuesto, es un ejemplo muy simple, solo muestra el concepto.

¿Qué puedes hacer para mejorarlo?

  1. Normalice las coordenadas del vector.

  2. Utilice la herramienta excelente vectorizador Tf-Idf para extraer las características de datos del texto.

  3. Agrega más datos.

¡Buena suerte!

Estoy intentando usar el SVM lineal y el clasificador K Neighbors para hacer la desambiguación del sentido de la palabra (WSD). Aquí hay un segmento de datos que estoy usando para entrenar los datos:

<corpus lang="English"> <lexelt item="activate.v"> <instance id="activate.v.bnc.00024693" docsrc="BNC"> <answer instance="activate.v.bnc.00024693" senseid="38201"/> <context> Do you know what it is , and where I can get one ? We suspect you had seen the Terrex Autospade , which is made by Wolf Tools . It is quite a hefty spade , with bicycle - type handlebars and a sprung lever at the rear , which you step on to <head>activate</head> it . Used correctly , you should n''t have to bend your back during general digging , although it wo n''t lift out the soil and put in a barrow if you need to move it ! If gardening tends to give you backache , remember to take plenty of rest periods during the day , and never try to lift more than you can easily cope with . </context> </instance> <instance id="activate.v.bnc.00044852" docsrc="BNC"> <answer instance="activate.v.bnc.00044852" senseid="38201"/> <answer instance="activate.v.bnc.00044852" senseid="38202"/> <context> For neurophysiologists and neuropsychologists , the way forward in understanding perception has been to correlate these dimensions of experience with , firstly , the material properties of the experienced object or event ( usually regarded as the stimulus ) and , secondly , the patterns of discharges in the sensory system . Qualitative Aspects of Experience The quality or modality of the experience depends less upon the quality of energy reaching the nervous system than upon which parts of the sensory system are <head>activated</head> : stimulation of the retinal receptors causes an experience of light ; stimulation of the receptors in the inner ear gives rise to the experience of sound ; and so on . Muller ''s nineteenth - century doctrine of specific energies formalized the ordinary observation that different sense organs are sensitive to different physical properties of the world and that when they are stimulated , sensations specific to those organs are experienced . It was proposed that there are endings ( or receptors ) within the nervous system which are attuned to specific types of energy , For example , retinal receptors in the eye respond to light energy , cochlear endings in the ear to vibrations in the air , and so on . </context> </instance> .....

La diferencia entre el entrenamiento y los datos de prueba es que los datos de prueba no tienen la etiqueta de "respuesta" . He creado un diccionario para almacenar las palabras que son vecinas de la palabra "head" para cada instancia con un tamaño de ventana de 10. Cuando hay varias para una instancia, solo voy a considerar la primera . También he creado un conjunto para registrar todo el vocabulario en el archivo de entrenamiento para poder calcular un vector para cada instancia. Por ejemplo, si el vocabulario total es [a, b, c, d, e], y una instancia tiene palabras [a, a, d, d, e], el vector resultante para esa instancia sería [2,0, 0,2,1] . Aquí está el segmento del diccionario que construí para cada palabra:

{ "activate.v": { "activate.v.bnc.00024693": { "instanceId": "activate.v.bnc.00024693", "senseId": "38201", "vocab": { "although": 1, "back": 1, "bend": 1, "bicycl": 1, "correct": 1, "dig": 1, "general": 1, "handlebar": 1, "hefti": 1, "lever": 1, "nt": 2, "quit": 1, "rear": 1, "spade": 1, "sprung": 1, "step": 1, "type": 1, "use": 1, "wo": 1 } }, "activate.v.bnc.00044852": { "instanceId": "activate.v.bnc.00044852", "senseId": "38201", "vocab": { "caus": 1, "ear": 1, "energi": 1, "experi": 1, "inner": 1, "light": 1, "nervous": 1, "part": 1, "qualiti": 1, "reach": 1, "receptor": 2, "retin": 1, "sensori": 1, "stimul": 2, "system": 2, "upon": 2 } }, ......

Ahora, solo tengo que proporcionar la entrada al clasificador de vecinos K y al SVM lineal del scikit-learn para entrenar al clasificador. Pero no estoy seguro de cómo construir el vector de características y la etiqueta para cada uno. Tengo entendido que la etiqueta debe ser una tupla de etiqueta de instancia y etiqueta senseid en la "respuesta". Pero no estoy seguro sobre el vector de características entonces. ¿Debería agrupar todos los vectores de la misma palabra que tiene la misma etiqueta de instancia y la etiqueta senseid en la "respuesta"? Pero hay alrededor de 100 palabras y cientos de instancias para cada palabra, ¿cómo se supone que debo lidiar con eso?

Además, el vector es una característica, necesito agregar más funciones más adelante, por ejemplo, synset, hipernyms, hipónimos etc. ¿Cómo se supone que haga eso?

¡Gracias por adelantado!


Siguiente paso: implementar el clasificador lineal multidimensional.

Desafortunadamente no tengo acceso a esta base de datos, así que esto es un poco teórico. Puedo proponer este enfoque:

Copia todos los datos en un archivo CSV como este:

SenseId,Word,Text,IsHyponim,Properties,Attribute1,Attribute2, ... 30821,"BNC","For neurophysiologists and ...","Hyponym sometype",1,1 30822,"BNC","Do you know what it is ...","Antonym type",0,1 ...

A continuación, puede usar sklearn herramientas de sklearn :

import pandas as pd df.read_csv(''file.csv'') from sklearn.feature_extraction import DictVectorizer enc=DictVectorizer() X_train_categ = enc.fit_transform(df[[''Properties'',]].to_dict(''records'')) from sklearn.feature_extraction.text import TfidfVectorizer vec=TfidfVectorizer(min_df=5) # throw out all terms which present in less than 5 documents - typos and so on v=vec.fit_transform(df[''Text'']) # Join all date together as a sparsed matrix from scipy.sparse import csr_matrix, hstack train=hstack( (csr_matrix(df.ix[:, ''Word'':''Text'']), X_train_categ, v)) y = df[''SenseId''] # here you have an matrix with really huge dimensionality - about dozens of thousand columns # you may use Ridge regression to deal with it: from sklearn.linear_model import Ridge r=Ridge(random_state=241, alpha=1.0) # prepare test data like training one

Más detalles sobre: Ridge , Ridge Classifier .

Otras técnicas para lidiar con el problema de alta dimensionalidad .

Ejemplo de código sobre clasificación de texto utilizando matrices de características dispersas .