Метка кодирования неструктурированных данных с ключевыми словами в Python (НЛП) - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть набор данных из 4 столбцов: «идентификатор», «ключевые слова», «возраст» и «пол». Цель моего проекта - определить возраст и пол человека на основе его текста. Мои ключевые слова: например, в следующем формате: fiber: 16; quoi: 1; опасности: 1; combien: 1; hightech: 1 Где слово перед: ключевое слово, а число - сколько раз оно упоминалось в тексте. I ' мы удалили id и выполнили некоторую предварительную обработку для удаления пропущенных значений, и т. д. c., но я ищу способ выполнить классификатор случайного леса или svm на модели, но не могу сделать это после разделения на тренировку и тестирование. Я уверен, что поступаю неправильно, но я собираюсь сделать некоторую сумку обработки слов или кодирования меток, чтобы создать столбец, в котором каждому ключевому слову присваивается номер, и другой столбец, сколько раз упомянуто это слово. Однако таким образом у меня будет более 7 миллионов столбцов, учитывая, что мой набор данных состоит из 7,6 м строк. Я приложил свой (довольно плохой) код ниже, может кто-нибудь мне помочь Правильное направление, пожалуйста?

import pandas as pd
import numpy as np
train=pd.read_csv(r"C:\train.csv", encoding='utf8')
train.head()

len(train)
7265055
train.isnull().sum()
ID               0
keywords    846396
age              0
sex              0
dtype: int64
train=train.dropna()
len(train)
6418659
train.drop(['ID'],axis = 1,inplace = True)
train.head()
keywords    age sex
0   fibre:16;quoi:1;dangers:1;combien:1;hightech:1...   62  F
1   restaurant:1;marrakech.shtml:1  35  M
2   payer:1;faq:1;taxe:1;habitation:1;macron:1;qui...   45  F
3   rigaud:3;laurent:3;photo:11;profile:8;photopro...   46  F
4   societe:1;disparition:1;proche:1;m%c3%a9lanie....   42  F
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
X_train,X_test, y_train, y_test=train_test_split(train["keywords"],train["sex"],test_size=0.2, random_state=42)
X_train.head()
4073238    detail_offre:11;editorial:1;candidature:1;accu...
1160322    classement:1;financial:1;article:1;les:1;effon...
6784749                                    002sbnv1fmder07:1
4549060    forum:1;sabia:1;josette:1;affich:1;goacolou:1;...
3636612    scan:2;politique:3;citations:1;apres:1;france:...
Name: keywords, dtype: object
reg=RandomForestClassifier (max_depth=50, random_state=0, min_samples_leaf=3,min_samples_split=5)
reg.fit(X_train, y_train)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-107-35dbd23650e6> in <module>
----> 1 reg.fit(X_train, y_train)

~\Anaconda3\lib\site-packages\sklearn\ensemble\_forest.py in fit(self, X, y, sample_weight)
    293         """
    294         # Validate or convert input data
--> 295         X = check_array(X, accept_sparse="csc", dtype=DTYPE)
    296         y = check_array(y, accept_sparse='csc', ensure_2d=False, dtype=None)
    297         if sample_weight is not None:

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    529                     array = array.astype(dtype, casting="unsafe", copy=False)
    530                 else:
--> 531                     array = np.asarray(array, order=order, dtype=dtype)
    532             except ComplexWarning:
    533                 raise ValueError("Complex data not supported\n"

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

~\Anaconda3\lib\site-packages\pandas\core\series.py in __array__(self, dtype)
    946             warnings.warn(msg, FutureWarning, stacklevel=3)
    947             dtype = "M8[ns]"
--> 948         return np.asarray(self.array, dtype)
    949 
    950     # ----------------------------------------------------------------------

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

~\Anaconda3\lib\site-packages\pandas\core\arrays\numpy_.py in __array__(self, dtype)
    164 
    165     def __array__(self, dtype=None):
--> 166         return np.asarray(self._ndarray, dtype=dtype)
    167 
    168     _HANDLED_TYPES = (np.ndarray, numbers.Number)

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: could not convert string to float: 'detail_offre:11;editorial:1;candidature:1;accueil_candidatures:4;leadership:1;comment:1;ils:1;emploi:44;embauche:1;votre:1;recherche_offres:7;liste_offres:22;conseils:1;les:1;perso:4;article:1;recruteurs:1;entretien:1;detail:1;evaluent:1'
#CountVectorizer Attempt
from sklearn.feature_extraction.text import CountVectorizer
vect=CountVectorizer()
vect.fit(train)
CountVectorizer(analyzer='word', binary=False, decode_error='strict',
                dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
                lowercase=True, max_df=1.0, max_features=None, min_df=1,
                ngram_range=(1, 1), preprocessor=None, stop_words=None,
                strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b',
                tokenizer=None, vocabulary=None)
print(vect.get_feature_names()[0:10])
print(vect.get_feature_names()[-10:])
['age', 'keywords', 'sex']
['age', 'keywords', 'sex']
def review_messages(msg):
    # converting messages to lowercase
    msg = msg.lower()
    return msg

from nltk import stem
from nltk.corpus import stopwords
stemmer = stem.SnowballStemmer('french')
stopwords = set(stopwords.words('french'))

def alternative_review_messages(msg):
    # converting messages to lowercase
    msg = msg.lower()
    # removing stopwords
    msg = [word for word in msg.split() if word not in stopwords]
    # using a stemmer
    msg = " ".join([stemmer.stem(word) for word in msg])
    return msg
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train['keywords'], train['age'], test_size = 0.2, random_state = 1)
# training the vectorizer 
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
train=vectorizer.fit_transform(train)
def pred(msg):
    msg = vectorizer.transform([msg])
    prediction = svm.predict(msg)
    return prediction[0]
from sklearn import svm
svm = svm.SVC(C=1000)
svm.fit(X_train, y_train)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-94-118187edaf25> in <module>
      1 from sklearn import svm
      2 svm = svm.SVC(C=1000)
----> 3 svm.fit(X_train, y_train)

~\Anaconda3\lib\site-packages\sklearn\svm\_base.py in fit(self, X, y, sample_weight)
    146         X, y = check_X_y(X, y, dtype=np.float64,
    147                          order='C', accept_sparse='csr',
--> 148                          accept_large_sparse=False)
    149         y = self._validate_targets(y)
    150 

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
    753                     ensure_min_features=ensure_min_features,
    754                     warn_on_dtype=warn_on_dtype,
--> 755                     estimator=estimator)
    756     if multi_output:
    757         y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    529                     array = array.astype(dtype, casting="unsafe", copy=False)
    530                 else:
--> 531                     array = np.asarray(array, order=order, dtype=dtype)
    532             except ComplexWarning:
    533                 raise ValueError("Complex data not supported\n"

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

~\Anaconda3\lib\site-packages\pandas\core\series.py in __array__(self, dtype)
    946             warnings.warn(msg, FutureWarning, stacklevel=3)
    947             dtype = "M8[ns]"
--> 948         return np.asarray(self.array, dtype)
    949 
    950     # ----------------------------------------------------------------------

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

~\Anaconda3\lib\site-packages\pandas\core\arrays\numpy_.py in __array__(self, dtype)
    164 
    165     def __array__(self, dtype=None):
--> 166         return np.asarray(self._ndarray, dtype=dtype)
    167 
    168     _HANDLED_TYPES = (np.ndarray, numbers.Number)

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: could not convert string to float: 'psychologie:1;horoscope:1;lion:1;jour:1;zodiaque:1'
pred("detail_offre:11;editorial:1;candidature:1")
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-93-4eeeec4fba8f> in <module>
----> 1 pred("detail_offre:11;editorial:1;candidature:1")

<ipython-input-92-f05e7c4d2a17> in pred(msg)
      1 def pred(msg):
      2     msg = vectorizer.transform([msg])
----> 3     prediction = svm.predict(msg)
      4     return prediction[0]

NameError: name 'svm' is not defined
...