Преобразуйте строковые элементы в числовые элементы в sklearn и pandas - PullRequest
0 голосов
/ 03 июля 2019

В настоящее время я работаю со sklearn (я новичок) и хочу потренироваться и протестировать очень наивный классификатор.

Структура моих данных обучения и тестирования следующая:

 ----|----|----|----|----|----|------|----|----|----|-------  
  f1 | f2 | f3 | c1 | c2 | c3 | word | c4 | c5 | c6 | label   
 ----|----|----|----|----|----|------|----|----|----|------- 

Где:

f1: feature 1, binary numerical type like 0
f2: feature 2, binary numerical type like 1
f3: feature 3, binary numerical type like 0
c1: context 1, string type like "from"
c2: context 2, string type like "this"
c3: context 3, string type like "website"
word: central word (string) of the context like "http://.."
c4: context 4, string type
c5: context 5, string type
c6: context 6, string type
label: this is the label (string) that the classifier has to train and predict like: "URL" (I have only three types of label: REF,IRR,DATA)

То, что я хочу сделать, - это преобразовать мои элементы строки контекста в числовые элементы. Каждое строковое поле состоит максимум из одного слова.

Основная цель - назначить числовое значение для каждого контекста и строки слова таким образом, чтобы система работала. Я подумал, что можно определить словарь как:

{ from, website, to, ... }

и передать этот словарь DictVectorizer, но я не знаю, как это сделать сейчас.

Что я действительно хочу сделать, так это генерировать огромное количество бинарных функций: слово «от», непосредственно предшествующее рассматриваемому слову, является одной функцией; слово «доступно» через две позиции после слова другое. Но я действительно не знаю как.

Вот что я пытался сделать:

#I tried to read the train csv:
train = pd.read_csv('train.csv')

#Drop the label field:
train_X = train.drop(['label'],axis=1)

#Take the other parameters:
train_y = train.label.values

#Then I convert the panda's data type into a dictionary: 
train_X = train_X.to_dict('r')

#And I tried to vectorize everything:
vec = DictVectorizer()
train_X = vec.fit_transform(train_X).toarray()

Очевидно, не сработало. Это потому, что поля контекста и слова могут быть очень большими словами, такими как URL.

Есть предложения? Я принимаю все виды решений.

Большое спасибо.

1 Ответ

0 голосов
/ 03 июля 2019

Если уникальные слова конечны, вы можете сделать что-то подобное, используя панд.

mapping_dict = {'word1':0,
                'word2':1,
                'word3':3  }

df[col] = df[col].str.map(mapping_dict)
...