Зачем нам НЛП:

Обработка естественного языка (NLP) — это область машинного обучения, в которой компьютер способен понимать, анализировать, манипулировать и потенциально генерировать человеческий язык. Под капотом алгоритмы машинного обучения — не что иное, как набор математических вычислений, и, очевидно, если мы передаем слова/предложения моделям машинного обучения, они не знают, как с этим справиться. Следовательно, нам нужно преобразовать их в векторы, которые модели машинного обучения могут понимать и выполнять над ними операции. И здесь в дело вступают все библиотеки NLP, такие как spaCy, nltk.

просторный?

spaCy предоставляет универсальное решение задач, обычно используемых в любом проекте НЛП, в том числе:

  • Токенизация
  • лемматизация
  • Маркировка частями речи
  • Разбор зависимостей
  • Преобразование слова в вектор
  • Многие традиционные методы очистки и нормализации текста

В этой статье мы сосредоточимся только на преобразованиях Word в вектор.

Давайте начнем:

Но обо всем по порядку. Мы должны знать, как установить spaCy, и pip сделает эту задачу за нас, нужно выполнить всего две команды, и все готово.

pip install spacy
python -m spacy download en_vectors_web_lg

Первая команда устанавливает для нас spaCy, а вторая загружает модели spaCy, которые содержат встроенные векторы слов.

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



Теперь, когда вы загрузили набор данных, давайте загрузим данные с помощью pandas.

>>data = pd.read_csv("train.csv")
>>tweets = data.tweet[:100]

Переменная tweets содержит только столбец твитов. Давайте посмотрим на первые пять твитов. Для нашей учебной цели мы берем 100 лучших твитов.

>>tweets.head().tolist()
[' @user when a father is dysfunctional and is so selfish he drags his kids into his dysfunction.   #run',
"@user @user thanks for #lyft credit i can't use cause they don't offer wheelchair vans in pdx.    #disapointed #getthanked",
'  bihday your majesty',
'#model   i love u take with u all the time in urð\x9f\x93±!!! ð\x9f\x98\x99ð\x9f\x98\x8eð\x9f\x91\x84ð\x9f\x91\x85ð\x9f\x92¦ð\x9f\x92¦ð\x9f\x92¦  ',
' factsguide: society now    #motivation']

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

""" Cleaning Tweets """
tweets = tweets.str.lower()
# removing special characters and numbers
tweets = tweets.apply(lambda x : re.sub("[^a-z\s]","",x) )
# removing stopwords
from nltk.corpus import stopwords
stopwords = set(stopwords.words("english"))
tweets = tweets.apply(lambda x : " ".join(word for word in x.split() if word not in stopwords ))
>>tweets.head.tolist()
['user father dysfunctional selfish drags kids dysfunction run',  'user user thanks lyft credit cant use cause dont offer wheelchair vans pdx disapointed getthanked', 
'bihday majesty',  
'model love u take u time ur',  
'factsguide society motivation']

Поскольку мы очистили твиты, давайте сразу перейдем к spaCy.

Создание токенов с помощью spaCy:

Создание токенов с помощью spaCy — это проще простого.

import spacy
import en_vectors_web_lg

>>nlp = en_vectors_web_lg.load()
>>document = nlp(tweets[0])
>>print("Document : ",document)
>>print("Tokens : ")
>>for token in document:
       print(token.text)
Document : user father dysfunctional selfish drags kids dysfunction
Tokens :
run
user 
father 
dysfunctional
selfish
drags
kids 
dysfunction 
run

en_vectors_web_lg.load() загружает модель spaCy и сохраняет ее в переменной nlp. Эта модель обучается с использованием 1 миллиона слов.

В nlp(string) мы передаем документ, который затем преобразуется в «spacy.tokens.doc.Doc» и сохраняется в переменном документе. Мы можем видеть, что когда мы печатаем документ, он кажется нам строкой, но не вводите себя в заблуждение, это на самом деле пространственный объект, который можно повторять. Когда пространственный объект повторяется, мы получаем токены.

Токен-вектор:

Путь перехода от токена к вектору также прост. Позвольте мне показать вам с помощью кода

>>document = nlp(tweets[0])
>>print(document)
>>for token in document:
       print(token.text, token.vector.shape)
user (300,)
father (300,) 
dysfunctional (300,) 
selfish (300,) 
drags (300,) 
kids (300,) 
dysfunction (300,) 
run (300,)

«token.vector» создает вектор размера (300,1). Приведенный выше код должен был получить вектор из каждого слова, одного предложения/документа. Но что, если у нас есть 100 таких предложений/документов в нашем корпусе, мы будем перебирать каждое предложение, создавать вектор для каждого слова и просто складывать их. Нет, это неправильный способ. Что мы можем сделать, так это использовать nlp.pipe().

Преобразование предложения в вектор с использованием канала:

nlp.pipe() обрабатывает тексты как поток и буферизует их пакетами, а не по одному, и преобразует каждый документ в пространственный объект. Обычно это намного эффективнее. И тогда вместо того, чтобы перебирать каждый токен документа, мы можем перебрать каждый документ и получить вектор для документа вместо слова. Разве это не впечатляет? Ну, я нахожу это так.

>>document = nlp.pipe(tweets)
>>tweets_vector = np.array([tweet.vector for tweet in document])
>>print(tweets_vector.shape)
(100, 300)

Отсюда мы получили вектор из 100 твитов 300 измерений. Теперь мы можем использовать эти созданные векторы для разработки простой модели, такой как логистическая регрессия или SVM, чтобы определить, является ли речь расистской или нет. И только простые модели мы также можем использовать эти векторы для обучения нейронных сетей.

Модель логистической регрессии:

Поскольку мы очистили наши твиты и превратили твиты в вектор, мы можем использовать эти векторы, чтобы предсказать, является ли твит расистским или нет. Столбец «Ярлык» в наборе данных имеет значения 0 и 1. 0 означает, что твит не является расистским, а 1 означает, что твит является расистским. Обратите внимание, что для целей моделирования я взял весь набор данных, а не только 100 лучших точек. Итак, давайте предскажем, создав простую модель.

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
X = tweets_vector
y = data["label"]
X_train,X_test, y_train, y_test = train_test_split(X,y, stratify=y, test_size=0.3, random_state=0)
model = LogisticRegression(C=0.1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy on test data is : %0.2f" %(accuracy_score(y_test, y_pred)*100))
y_train_pred = model.predict(X_train)
print("Accuracy on train data is : %0.2f" %(accuracy_score(y_train, y_train_pred)*100))
-> Accuracy on test data is : 94.49 
-> Accuracy on train data is : 94.50

Что ж, теперь, когда вы познакомились со spaCy, вы можете поиграть с ним и узнать больше о нем из документации spaCy, поскольку мы только что коснулись его поверхности. Такие вещи, как маркировка частей речи, распознавание сущностей, как обсуждалось выше, также могут быть выполнены с помощью spaCy.

Спасибо.