Внедрение K Neighbours Classifier и Linear SVM в scikit-learn для устранения неоднозначности в смысле Word

Я пытаюсь использовать линейный классификатор SVM и K Neighbours для устранения неоднозначности смысла Word (WSD). Вот сегмент данных, которые я использую для обучения данных:

<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>
.....

Разница между данными обучения и тестирования заключается в том, что данные теста не имеют тега "answer". Я построил словарь для хранения слов, которые являются соседями слова "head" для каждого экземпляра с размером окна 10. Когда их несколько для одного экземпляра, я собираюсь рассмотреть только первое. Я также создал набор для записи всего словаря в учебном файле, чтобы я мог вычислить вектор для каждого экземпляра. Например, если общий словарь [a,b,c,d,e], а в одном экземпляре есть слова [a,a,d,d,e], результирующий вектор для этого экземпляра будет равен [2,0, 0,2,1]. Вот сегмент словаря, который я построил для каждого слова:

{
    "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
            }
        }, 
        ......

Теперь мне просто нужно предоставить информацию для K Neighbours Classifier и Linear SVM из scikit-learn для обучения классификатора. Но я просто не уверен, как мне построить вектор объектов и метку для каждого. Насколько я понимаю, метка должна быть кортежем тега экземпляра и тегом senseid в "ответе". Но я не уверен насчет вектора функций тогда. Должен ли я сгруппировать все векторы из одного и того же слова, которое имеет одинаковый тег экземпляра и сенсорный тег в "ответе"? Но есть около 100 слов и сотни случаев для каждого слова, как я должен иметь дело с этим?

Кроме того, вектор - это одна особенность, позже мне нужно добавить больше функций, например, синсет, гиперны, гипонимы и т. Д. Как я должен это сделать?

Заранее спасибо!

2 ответа

Следующий шаг - внедрение многомерного линейного классификатора.

К сожалению, у меня нет доступа к этой базе данных, так что это немного теоретически. Я могу предложить этот подход:

Приведите все данные в один CSV-файл следующим образом:

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
...

Далее вы можете использовать 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

Более подробная информация о: хребет, хребет классификатор.

Другие методы для решения проблемы высокой размерности.

Пример кода для классификации текста с использованием разреженных матриц объектов.

Задачи машинного обучения - это своего рода задачи по оптимизации, в которых у вас нет заранее заданного алгоритма "лучший для всех", а скорее поиск лучшего результата с использованием различных подходов, параметров и предварительной обработки данных. Таким образом, вы абсолютно правы, начиная с самой простой задачи - принимая только одно слово и несколько его значений.

Но я просто не уверен, как мне построить вектор объектов и метку для каждого.

Вы можете принять только эти значения в качестве компонентов вектора. Перечислите векторные слова и напишите номера таких слов в каждом тексте. Если слово отсутствует, введите пустое значение. Я немного изменил ваш пример, чтобы прояснить идею:

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
        }

Давайте сделаем так, чтобы он содержал вектор. Перечислите все слова и отметьте, сколько раз это слово присутствует в словаре.

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)

Давайте смотреть:

>>> 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]

Эти vect_38201 и vect38202 являются векторами, которые вы можете использовать в подходящей модели:

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]])

Выход:

array([38202])

Конечно, это очень очень простой пример, просто показать концепцию.

Что вы можете сделать, чтобы улучшить его?

  1. Нормализовать векторные координаты.

  2. Используйте отличный инструмент Tf-Idf vectorizer для извлечения данных из текста.

  3. Добавьте больше данных.

Удачи!

Другие вопросы по тегам