Amazon Alexa, также известная как Alexa, - это технология виртуального помощника AI, разработанная Amazon и впервые использованная в умных динамиках Amazon Echo. Он позволяет мгновенно подключаться, чтобы воспроизводить музыку, управлять своим умным домом, получать информацию, новости, погоду и многое другое.

Посмотрите мой прогноз на https://www.kaggle.com/rakshmithamadhevan/amazon-alexa-spacy

А теперь давайте проверим отзывы!

import spacy
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('fivethirtyeight')

# for advanced visualizations
import plotly.offline as py
from plotly.offline import init_notebook_mode, iplot
import plotly.graph_objs as go
from plotly import tools
init_notebook_mode(connected = True)
import plotly.figure_factory as ff
#loading english module
nlp = spacy.load('en')
#reading the csv file
data = pd.read_csv('../input/amazon-alexa/amazon_alexa.tsv', delimiter = '\t', quoting = 3)
data["variation"].head()

Атрибуты уровня слова:

txt = data["verified_reviews"][1009]
txt

data.describe()

doc = nlp(txt)    
olist = []
for token in doc:
    l = [token.text,
        token.idx,
        token.lemma_,
        token.is_punct,
        token.is_space,
        token.shape_,
        token.pos_,
        token.tag_]
    olist.append(l)
    
odf = pd.DataFrame(olist)
odf.columns= ["Text", "StartIndex", "Lemma", "IsPunctuation", "IsSpace", "WordShape", "PartOfSpeech", "POSTag"]
odf

Просто вызов функции «nlp» в текстовом столбце дает нам много информации. Подробности таковы:

  • Текст - токенизированное слово
  • StartIndex - Индекс, с которого начинается слово в предложении
  • Лемма - Лемма слова (отдельно лемматизацию делать не нужно)
  • IsPunctuation - является ли данное слово знаками препинания или нет
  • IsSpace - является ли данное слово просто пробелом или нет
  • WordShape - предоставляет информацию о форме слова (если все буквы в верхнем регистре, мы получим XXXXX, если все в нижнем регистре, то xxxxx, если первая буква верхняя, а другие нижние, то Xxxxx и т. Д.)
  • PartOfSpeech - Часть речи слова
  • POSTag - Тег для части речи слова

Распознавание именованных сущностей:

Именованная сущность - это «реальный объект», которому присвоено имя - например, человек, страна, продукт или название книги.
Мы также получаем распознавание именованной сущности как часть пакета spacy. Он встроен в модель на английском языке, и мы также можем обучать наши собственные сущности, если это необходимо.

doc = nlp(txt)
olist = []
for ent in doc.ents:
    olist.append([ent.text, ent.label_])
    
odf = pd.DataFrame(olist)
odf.columns = ["Text", "EntityType"]
odf

from spacy import displacy
def explain_text_entities(text):
    doc = nlp(text)
    for ent in doc.ents:
        print(f'Entity: {ent}, Label: {ent.label_}, {spacy.explain(ent.label_)}')
for i in range(15, 50):
    one_sentence = data['verified_reviews'][i]
    doc = nlp(one_sentence)
displacy.render(doc, style='ent', jupyter=True)

Парсер зависимостей

Синтаксический анализатор зависимостей анализирует грамматическую структуру предложения, устанавливая отношения между «головными» словами и словами, которые изменяют эти заголовки.
Spacy может использоваться для создания этих анализаторов зависимостей, которые могут использоваться в различных задачах

doc = nlp(data["verified_reviews"][1009])
olist = []
for token in doc:
    olist.append([token.text, token.dep_, token.head.text, token.head.pos_,
          [child for child in token.children]])
odf = pd.DataFrame(olist)
odf.columns = ["Text", "Dep", "Head text", "Head POS", "Children"]
odf

  • Текст: исходный текст токена.
  • Dep: синтаксическое отношение, связывающее ребенка с головой.
  • Текст заголовка: исходный текст заголовка токена.
  • Head POS: тег части речи для головы токена.
  • Потомки: непосредственные синтаксические зависимые от токена.
displacy.render(doc, style='dep', jupyter=True, options={'distance': 90})

Сходство слов:

Spacy также имеет векторную модель слова. Таким образом, мы можем использовать то же самое, чтобы найти похожие слова.
Теперь мы можем использовать косинусное сходство, чтобы найти слова, похожие на слово «Любовь»

from scipy import spatial

cosine_similarity = lambda x, y: 1 - spatial.distance.cosine(x, y)

love = nlp.vocab['love'].vector
computed_similarities = []
for word in nlp.vocab:
    # Ignore words without vectors
    if not word.has_vector:
        continue
    similarity = cosine_similarity(love, word.vector)
    computed_similarities.append((word, similarity))

computed_similarities = sorted(computed_similarities, key=lambda item: -item[1])
print([w[0].text for w in computed_similarities[:10]])

queen = nlp.vocab['love']
happy = nlp.vocab['happy']
fun = nlp.vocab['fun']
kids = nlp.vocab['kids']
king = nlp.vocab['King']
 
print("Word similarity score between love and happy : ",queen.similarity(happy))
print("Word similarity score between love and funn : ",queen.similarity(fun))

Визуализация данных

ratings = data['rating'].value_counts()

label_rating = ratings.index
size_rating = ratings.values

colors = ['pink', 'lightblue', 'aqua', 'gold', 'crimson']

rating_piechart = go.Pie(labels = label_rating,
                         values = size_rating,
                         marker = dict(colors = colors),
                         name = 'Alexa', hole = 0.3)

df = [rating_piechart]

layout = go.Layout(
           title = 'Distribution of Ratings for Alexa')

fig = go.Figure(data = df,
                 layout = layout)

py.iplot(fig)

feedbacks = data['feedback'].value_counts()

label_feedback = feedbacks.index
size_feedback = feedbacks.values

colors = ['yellow', 'lightgreen']

feedback_piechart = go.Pie(labels = label_feedback,
                         values = size_feedback,
                         marker = dict(colors = colors),
                         name = 'Alexa', hole = 0.3)

df2 = [feedback_piechart]
layout = go.Layout(title = 'Distribution of Feedbacks for Alexa')
fig = go.Figure(data = df2,layout = layout)
py.iplot(fig)

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(stop_words = 'english')
words = cv.fit_transform(data.verified_reviews)
sum_words = words.sum(axis=0)

words_freq = [(word, sum_words[0, idx]) for word, idx in cv.vocabulary_.items()]
words_freq = sorted(words_freq, key = lambda x: x[1], reverse = True)
frequency = pd.DataFrame(words_freq, columns=['word', 'freq'])

plt.style.use('fivethirtyeight')
color = plt.cm.ocean(np.linspace(0, 1, 20))
frequency.head(20).plot(x='word', y='freq', kind='bar', figsize=(15, 6), color = color)
plt.title("Most Frequently Occuring Words - Top 20")
plt.show()

from wordcloud import WordCloud

wordcloud = WordCloud(background_color = 'lightcyan', width = 2000, height = 2000).generate_from_frequencies(dict(words_freq))

#plt.style.use('fivethirtyeight')
plt.figure(figsize=(10, 10))
plt.axis('off')
plt.imshow(wordcloud)
#plt.title("Vocabulary from Reviews", fontsize = 20)
plt.show()