无监督学习与生成式人工智能(MEAP)(三)(3)

简介: 无监督学习与生成式人工智能(MEAP)(三)

无监督学习与生成式人工智能(MEAP)(三)(2)https://developer.aliyun.com/article/1522606

用 Python 实现的情感分析案例研究

到目前为止,我们已经讨论了许多关于 NLP 和文本数据的概念。在本节中,我们首先将探讨一个业务案例,然后在同一案例上开发 Python 解决方案。我们正在进行情感分析。

产品评论是信息的丰富来源 - 对客户和组织都是如此。每当我们希望购买任何新产品或服务时,我们倾向于查看其他客户的评论。您可能自己也曾评论过产品和服务。这些评论可以在亚马逊、博客、调查等处找到。

让我们考虑一个案例。一个供水公用事业提供商收到了客户的投诉,对供水的评论以及对整体体验的评论。可能的流是 - 产品质量、定价、注册体验、注册流程的简易性、付款流程、供水评论、电力评论等等。我们想要确定评论的一般背景 - 它是积极的、消极的还是中立的。评论有分配的星级数量、实际文本评论、关于产品/服务的优点和缺点、属性等。但与此同时,也存在一些业务问题,如:

  1. 许多时候,观察到产品/服务收到的星级数量非常高,而实际评论却相当负面。
  2. 组织和产品所有者需要知道客户喜欢哪些功能,哪些功能不受客户喜欢。然后团队可以着手改进客户不喜欢的功能。
  3. 还需要评估并密切关注竞争!组织需要知道竞争对手的热门产品的属性。
  4. 产品所有者可以更好地计划他们希望在未来发布的功能。

因此,业务团队将能够回答这两个最重要的问题:

  1. 我们客户对产品和服务的满意度水平是多少?
  2. 客户的主要痛点和不满,驱动客户参与的因素,哪些服务是复杂且耗时的,哪些服务/产品最受欢迎?

这个商业用例将带来以下业务利益:

  1. 最令人满意且最受欢迎的产品和服务应该继续。
  2. 那些不受欢迎且得到负面评分的功能必须得到改进,挑战也必须得到缓解。
  3. 各自的团队,如财务、运营、投诉、CRM 等,可以被通知,并且他们可以分别工作以改善客户体验。
  4. 喜欢或不喜欢服务的精确原因将对相应的团队有助于朝正确的方向努力。
  5. 总的来说,它将为测量客户基础的净推荐得分(NPS)提供一个基准。企业可以努力提升整体客户体验。
  6. 我们可能希望通过仪表板来表示这些发现。这个仪表板将定期刷新,比如每月或每季度刷新一次。

要解决这个业务问题,团队可以从网站、调查、亚马逊、博客等收集相关数据。然后对该数据集进行分析。分析结构化数据相对容易。在这个例子中,我们将处理文本数据。

Python Jupyter 笔记本在 GitHub 地址上进行了检入。建议您使用 GitHub 地址上的 Jupyter 笔记本,因为它包含更多步骤。

第 1 步:我们在这里导入所有库。

#### Loading all the required libraries here
from lxml import html  
import requests
import pandas as pd
from nltk.corpus import stopwords
from textblob import TextBlob
import matplotlib.pyplot as plt
import sys
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import sklearn
import scikitplot as skplt
import nltk
#to ignore warnings
import warnings
warnings.filterwarnings("ignore")
nltk.download('stopwords')
nltk.download('punkt')
nltk.download('wordnet')

第 2 步:我们在这里定义标签。这些标签用于从评论中获取产品的属性。

xpath_reviews = '//div[@data-hook="review"]'
reviews = parser.xpath(xpath_reviews)
xpath_rating  = './/i[@data-hook="review-star-rating"]//text()' 
xpath_title   = './/a[@data-hook="review-title"]//text()'
xpath_author  = './/a[@data-hook="review-author"]//text()'
xpath_date    = './/span[@data-hook="review-date"]//text()'
xpath_body    = './/span[@data-hook="review-body"]//text()'
xpath_helpful = './/span[@data-hook="helpful-vote-statement"]//text()'

第 3 步:我们现在正在准备好提取数据。我们正在创建一个数据框来存储客户评论。然后我们迭代所有评论,然后提取信息。

# Create a dataframe here. 
reviews_df = pd.DataFrame()
for review in reviews:
    rating  = review.xpath(xpath_rating)
    title   = review.xpath(xpath_title)
    author  = review.xpath(xpath_author)
    date    = review.xpath(xpath_date)
    body    = review.xpath(xpath_body)
    helpful = review.xpath(xpath_helpful)
    review_dict = {'rating': rating,
                   'title': title,
                   'author': author,             
                   'date': date,
                   'body': body,
                   'helpful': helpful}
    reviews_df = reviews_df.append(review_dict, ignore_index=True)
all_reviews = pd.DataFrame()

第 4 步:让我们迭代通过评论然后填写详细信息。

# Fill the values of the reviews here. . 
for i in range(1,90):
    amazon_url = 'https://www.amazon.co.uk/Hive-Heating-Thermostat-Professional-Installation/product-reviews/B011B3J6KY/ref=cm_cr_othr_d_show_all?ie=UTF8&reviewerType=all_reviews&pageNumber='+str(i)
    headers = {'User-Agent': user_agent}
    page = requests.get(amazon_url, headers = headers)
    parser = html.fromstring(page.content)
    xpath_reviews = '//div[@data-hook="review"]'
    reviews = parser.xpath(xpath_reviews)
    reviews_df = pd.DataFrame()
    xpath_rating  = './/i[@data-hook="review-star-rating"]//text()' 
    xpath_title   = './/a[@data-hook="review-title"]//text()'
    xpath_author  = './/a[@data-hook="review-author"]//text()'
    xpath_date    = './/span[@data-hook="review-date"]//text()'
    xpath_body    = './/span[@data-hook="review-body"]//text()'
    xpath_helpful = './/span[@data-hook="helpful-vote-statement"]//text()'
    #print(i)
    for review in reviews:
        rating  = review.xpath(xpath_rating)
        title   = review.xpath(xpath_title)
        author  = review.xpath(xpath_author)
        date    = review.xpath(xpath_date)
        body    = review.xpath(xpath_body)
        helpful = review.xpath(xpath_helpful)
        review_dict = {'rating': rating,
                       'title': title,
                       'author': author,             
                       'date': date,
                       'body': body,
                       'helpful': helpful}
        reviews_df = reviews_df.append(review_dict, ignore_index=True)
    #print(reviews_df)
    all_reviews = all_reviews.append(reviews_df)

第 5 步:让我们看看我们生成的输出。

all_reviews.head()

第 6 步:现在我们将输出保存到一个路径。您可以提供自己的路径。

out_folder = '/Users/vaibhavverdhan/Book/UnsupervisedLearningBookFinal/'
all_reviews.to_csv(out_folder + 'Reviews.csv')

第 7 步:加载数据并分析。

#Load the data now and analyse it
data_path = '/Users/vaibhavverdhan/Book/UnsupervisedLearningBookFinal/'
reviewDataCSV = 'Reviews.csv'
reviewData = (pd.read_csv(data_path+reviewDataCSV,index_col=0,))

第 8 步:我们现在将查看数据集的基本信息。

reviewData.shape
reviewData.rating.unique()
reviewData.rating.value_counts()

第 9 步:我们现在将查看评论中给出的星级分布。这将帮助我们理解客户给出的评论。

labels = '5 Stars', '1 Star', '4 Stars', '3 Stars', '2 Stars'
sizes = [reviewData.rating.value_counts()[0], reviewData.rating.value_counts()[1],reviewData.rating.value_counts()[2],reviewData.rating.value_counts()[3],reviewData.rating.value_counts()[4]]
colors = ['green', 'yellowgreen', 'coral', 'lightblue', 'grey']
explode = (0, 0, 0, 0, 0)  # explode 1st slice
# Plot
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=140)
plt.axis('equal')
plt.show()

第 10 步:将文本转换为小写,并删除停用词和频率最高的单词。

reviewData.body = reviewData.body.str.lower()
reviewData.body = reviewData.body.str.replace('[^\w\s]','')
stop = stopwords.words('english')
reviewData.body = reviewData.body.apply(lambda x: " ".join(x for x in x.split() if x not in stop))
freq = list(freq.index)
reviewData.body = reviewData.body.apply(lambda x: " ".join(x for x in x.split() if x not in freq))
freq = pd.Series(' '.join(reviewData.body).split()).value_counts()[-10:]
freq = list(freq.index)
reviewData.body = reviewData.body.apply(lambda x: " ".join(x for x in x.split() if x not in freq))

第 11 步:现在对数据进行分词。

from nltk.tokenize import word_tokenize
tokens = word_tokenize(reviewData.iloc[1,1])
print(tokens)

第 12 步:我们现在正在执行词形还原。

from textblob import Word
reviewData.body = reviewData.body.apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
reviewData.body.head()

第 13 步:现在我们正在将所有评论附加到字符串上。

sentimentString = reviewData.iloc[1,1]
# append to this string 
for i in range(2,len(reviewData)):
    sentimentString = sentimentString + reviewData.iloc[i,1]

第 14 步:情感分析在这里完成。我们从 TextBlob 中获取情感方法。它为情感生成极性和主观性。

# the functions generates polarity and subjectivity here, subsetting the polarity only here
allReviewsSentiment = reviewData.body[:900].apply(lambda x: TextBlob(x).sentiment[0])
# this contains boths subjectivity and polarity
allReviewsSentimentComplete = reviewData.body[:900].apply(lambda x: TextBlob(x).sentiment)
allReviewsSentimentComplete.head()

第 15 步:将情感保存到 csv 文件中。

allReviewsSentiment.to_csv(out_folder + 'ReviewsSentiment.csv')

第 15 步:我们现在将给情感分配一个含义或标签。我们正在将每个分数分类为非常满意到非常不满意。

allReviewsSentimentDF = allReviewsSentiment.to_frame()
# Create a list to store the data
grades = []
# For each row in the column,
for row in allReviewsSentimentDF['body']:
    # if more than a value,
    if row >= 0.75:
       grades.append('Extremely Satisfied')
    elif (row >= 0.5) & (row < 0.75):
        grades.append('Satisfied')
    elif (row >= 0.2) & (row < 0.5):
        grades.append('Nice')
    elif (row >= -0.2) & (row < 0.2):
        grades.append('Neutral')
    elif (row > -0.5) & (row <= -0.2):
        grades.append('Bad')
    elif (row >= -0.75) & (row < -0.5):
        grades.append('Dis-satisfied')
    elif  row < -0.75:
        grades.append('Extremely Dis-satisfied')
    else:
        # Append a failing grade
        grades.append('No Sentiment')
# Create a column from the list
allReviewsSentimentDF['SentimentScore'] = grades
allReviewsSentimentDF.head()

第 16 步:我们现在将查看情感得分并绘制它们。最后,我们将它们与主数据集合并。

allReviewsSentimentDF.SentimentScore.value_counts()
allReviewsSentimentDF['SentimentScore'].value_counts().plot(kind='bar')
#### Merge the review data with Sentiment generated
# add column Polarity Score
reviewData['polarityScore'] = allReviewsSentimentDF['body']

在这个案例研究中,您不仅从网站上抓取了评论,还分析了数据集。如果我们比较情感,我们可以看到给产品的星级并不代表真实情况。

在 () 中,我们正在比较实际的星级和情感分析的输出。我们可以观察到,73% 的人给出了 5 星,7% 的人给出了 4 星,而在情感分析中,大多数评论被分类为中性。这就是情感分析的真正力量!

图 7-8 比较左侧的原始星级分布,观察情感分析的实际结果


情感分析是一个非常重要的用例。它对企业和产品团队非常有用。

我们现在将转到使用 Python 进行文档分类的第二个案例研究。

使用 Python 进行文本聚类

想象一下。你有一堆的文本数据集或文档。但是它们都混在一起了。我们不知道文本属于哪个类别。在这种情况下,我们假设我们手头有两类文本数据集 - 一个与足球有关的数据,第二类是旅行。我们将开发一个可以分离这两个类别的模型。

第一步:导入所有库

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd

第二步:我们现在正在创建一个虚拟数据集。这段文本数据是我们自己写的几句话。有两个类别 -

text = ["It is a good place to travel",
            "Football is a nice game", "Lets go for holidays and travel to Egypt",
            "It is a goal, a great game.", "Enjoy your journey and fortget the rest", "The teams are ready for the same" ]

第三步:我们将使用 tfidf 对数据进行向量化处理。

tfidf_vectorizer = TfidfVectorizer(stop_words='english')
X = tfidf_vectorizer.fit_transform(text)

第四步:现在让我们进行聚类。

k = 2
model = KMeans(n_clusters=k, init='k-means++', max_iter=10, n_init=2)
model.fit(X)

第五步:让我们表示质心并打印输出。

centroids = model.cluster_centers_.argsort()[:, ::-1]
features = vectorizer.get_feature_names()
for i in range(k):
    print("Cluster %d:" % i),
    for ind in centroids[i, :10]:
        print("%s" % terms[ind])


您还可以将此示例扩展到其他数据集。使用自己的数据集并复制上面示例中的代码。

不再有使用 Word2Vec 和 GloVe 的 Python Jupyter 笔记本了。我们已经将代码检入到了本书的 GitHub 位置。建议您使用它。这是一个非常重要的表示文本数据的资源。

至此,我们来到了这个令人兴奋的章节的结尾。现在让我们进入总结部分。

7.6 小结

文本数据是最有用的数据集之一。很多智慧隐藏在文本中。日志、博客、评论、推文、投诉、评论、文章等等 - 文本数据的来源很多。机构已经开始投资建立访问文本数据和存储文本数据的基础设施。分析文本数据需要更好的处理能力和更好的计算机。它需要特殊的技能和更深入的理解概念。NLP 是一个不断发展的领域,许多研究正在进行中。与此同时,我们不能忽视商业敏锐度和知识的重要性。

数据分析和机器学习并不容易。我们必须理解很多关于数据清洗、数据探索、数据表示和建模的概念。但是,分析非结构化数据可能比结构化数据集更加复杂。在上一章中,我们处理了图像数据集。在当前章节中,我们处理了文本数据。

文本数据是最难分析的数据之一。文本数据有很多排列组合。清洗文本数据并不容易,是一项相当复杂的任务。在本章中,我们讨论了几种清洗文本数据的重要技术。我们还介绍了几种将文本数据表示为向量形式的重要方法。建议您对这些方法进行实践,并通过应用每种技术进行比较性能。

随着这一章的结束,我们也结束了书的第二部分。在书的下一部分,复杂性会增加。我们将研究更深层次的无监督学习算法概念。

你现在可以转到练习问题。

实用的下一步和建议阅读

  1. 从下面的链接获取数据集。在这里你会找到很多文本数据集。建议你实现聚类和降维解决方案。
    blog.cambridgespark.com/50-free-machine-learning-datasets-natural-language-processing-d88fb9c5c8da
  2. 这是文本数据集的第二个来源,你会找到许多有用的数据集。
    www.kaggle.com/datasets?search=text
  3. 你被建议阅读研究论文《在向量空间中高效估计词表示》(Efficient Estimation of Word Representations in Vector Space),作者是 Tomas Mikolov、Kai Chen、Greg Corrado、Jeffrey Dean。
    arxiv.org/pdf/1301.3781.pdf
  4. 你被建议阅读研究论文《GloVe:用于词表示的全局向量》(GloVe: Global Vectors for Word Representation),作者是 Jeffrey Pennington、Richard Socher、Christopher D. Manning。
    nlp.stanford.edu/pubs/glove.pdf
  5. 有几篇论文被广泛引用。
  6. Avrim Blum 和 Tom Mitchell:使用共训练结合标记和未标记数据,1998 年
  7. Kevin Knight:贝叶斯推断与眼泪,2009 年。
  8. Thomas Hofmann:概率隐语义索引,SIGIR 1999。
  9. Donald Hindle 和 Mats Rooth。结构歧义和词汇关系,计算语言学,1993 年。
  10. Collins 和 Singer:命名实体分类的无监督模型,EMNLP 1999。
  11. 你被建议阅读研究论文《使用 TF-IDF 确定文档查询中单词相关性》(Using TF-IDF to Determine Word Relevance in Document Queries),作者是 Juan Ramos。
    citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.121.1424&rep=rep1&type=pdf
  12. 你被建议阅读研究论文《使用 TF-IDF 和下一个词否定改进的文本情感分类模型》(An Improved Text Sentiment Classification Model Using TF-IDF and Next Word Negation),作者是 Bijoyan Das 和 Sarit Chakraborty。
    arxiv.org/pdf/1806.06407.pdf

第八章:深度学习:基本概念

本章介绍

  • 深度学习
  • 深度学习的构建模块
  • 神经网络中的层
  • 激活函数
  • 使用深度学习的监督学习
  • 无监督学习使用深度学习
  • 使用 tensorflow 和 keras 的 Python 代码
  • 深度学习库

“生活真的很简单,但我们一直坚持要把它弄复杂 - 孔子”

欢迎来到本书的第三部分。到目前为止,你已经学习了很多概念、案例研究和 Python 代码。从本章开始,复杂性水平将更高。

在本书的前两部分,我们涵盖了各种无监督学习算法,如聚类,降维等等。我们讨论了简单和高级算法。我们还在本书的最后一部分讨论了处理文本数据的方法。从本书的第三部分开始,我们将开始深度学习的旅程。

深度学习和神经网络改变了世界和商业领域。你一定听说过深度学习和神经网络。它们的实施和复杂性导致更好的癌症检测,自动驾驶汽车,改进的灾害管理系统,更好的污染控制系统,减少交易欺诈等等。

在本书的第三部分,我们将探讨使用深度学习的无监督学习。我们将学习什么是深度学习和神经网络的基础知识。我们将研究神经网络中的层,激活函数,深度学习的过程和各种库。然后我们将转向自动编码器、生成对抗网络和深度信念网络。这些话题确实很复杂,有时候相当数学密集。我们将使用不同类型的数据集来解决问题,但主要是非结构化的数据集。和往常一样,Python 将用于生成解决方案。我们还分享了许多外部资源来补充这些概念。请注意,这些都是非常先进的主题,对于这些主题仍在进行大量的研究。

我们将第三部分分为三章。第八章介绍了所需的深度学习和神经网络的基础概念。接下来的两章将专注于自动编码器,GAN 和深度信念网络。本书的最后一章讨论了这些模型的部署。

本章讨论了神经网络和深度学习的概念。我们将讨论什么是神经网络,什么是激活函数,什么是不同的优化函数,神经网络训练过程等。在你理解自动编码器和生成对抗网络的更深层次概念之前,了解这些深度学习概念对你来说至关重要。本章涵盖的概念是神经网络和深度学习的基础,也是下两章进一步学习的基础。因此,你清楚这些概念非常重要。在本章末尾还有更详细的外部资源可供获取这些概念。

欢迎来到第八章,祝一切顺利!

8.1 技术工具包

我们将继续使用迄今为止使用的相同版本的 Python 和 Jupyter 笔记本。本章中使用的代码和数据集已经保存到了此位置。

您需要在本章中安装一些 Python 库,它们是 - tensorflow 和 keras。

让我们开始学习第八章吧!

无监督学习与生成式人工智能(MEAP)(三)(4)https://developer.aliyun.com/article/1522609

相关文章
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
生成式人工智能(AIGC,Generative AI)
生成式人工智能(AIGC,Generative AI)
22 3
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
生成式人工智能(Generative AI)
生成式人工智能(Generative AI)
19 0
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
生成式人工智能(AIGC,Generative AI)
生成式人工智能(AIGC,Generative AI)
11 0
|
24天前
|
机器学习/深度学习 算法 TensorFlow
无监督学习与生成式人工智能(MEAP)(三)(5)
无监督学习与生成式人工智能(MEAP)(三)
19 0
|
24天前
|
机器学习/深度学习 人工智能 自然语言处理
无监督学习与生成式人工智能(MEAP)(三)(4)
无监督学习与生成式人工智能(MEAP)(三)
10 0
|
2天前
|
人工智能 前端开发 搜索推荐
人工智能(AI)在前端设计中的创新应用
人工智能(AI)在前端设计中的创新应用
19 4
|
5天前
|
传感器 人工智能 搜索推荐
人工智能(AI)与物联网(IoT)的融合是当今技术领域的一个重要趋势
人工智能(AI)与物联网(IoT)的融合是当今技术领域的一个重要趋势
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能(AI)在金融领域的应用已经成为改变金融业态的重要力量
人工智能(AI)在金融领域的应用已经成为改变金融业态的重要力量
|
5天前
|
人工智能 前端开发 搜索推荐
人工智能(AI)和低代码开发平台
人工智能(AI)和低代码开发平台
17 1
|
5天前
|
机器学习/深度学习 人工智能 算法
人工智能(AI)、机器学习(ML)和深度学习(DL)
人工智能(AI)、机器学习(ML)和深度学习(DL)
17 1

热门文章

最新文章