本文为 AI 研习社编译的技术博客,原标题 What App Descriptions Tell Us: Text Data Preprocessing in Python,作者为Finn Qiao。

翻译 | nick李    校对 |  付腾   整理 |  令双

除了数据清洗和数据探索的主题外,许多有效的NLP(自然语言处理)分析都是依赖于对文本数据的预处理。因此,我决定手把手展现一个对来自苹果App Store简述的文本数据预处理的过程,并且对这些数据使用K均值聚类算法。

为什么要选择App Store呢?Kaggle的数据集包括了7197个应用及其各自的应用简述。应用开发者在应用简述中用尽所能来“推销”他们的应用。我使用这些预处理的数据,检验了一个问题——是否能根据应用简述对应用类别进行良好预测?

我所使用的预处理“框架”主要如下:

翻译*

去除非字母字符

大写转小写

分词

去除停用词

词干提取(stemming)**

数据分析

* 我首先对所有简述进行翻译的原因是,非字母字符的正则表达式可能会将某些语言去除掉,例如日文和中文。

** 在这一步中我省去了词形还原(lemmatization)因为我想要在后面的步骤中着眼于词汇多样性。

和普遍做法一样,我们先以读取csv文件获得相关数据开始。在这里,我们将有基本应用信息的数据帧(Dataframe)和有应用简述的数据帧合并。

由于大部分特征变量的数据类型都是合理的,让我们先概览一下相关数据。

不出所料的是,App Store中大部分应用是游戏,这一类别大约占数据集的54%。其次是”娱乐“和”教育“,与游戏相差甚远,分别占比7%和6%。

平均评分最高的类别是”效率“和”音乐“。有趣的是,目前为止”商品指南“、“经济”和“图书”为App Store中评分最低的三个应用类别。

预处理过程

1 译成英文

开始预处理我们首先将所有应用简述翻译为英文。此处我们可以使用googletrans包来调用谷歌翻译的API。遗憾的是,这个API调用有15000个字符的限制。我们可以通过在数据帧的每一行重新初始化translator来应对字数限制,尽管这不是优雅的编程方式。

当应用简述已经是英文的时候,我们可以使用langdetect包来进行检测并仅在语言不是英文才调用API,这样以减少无用的API调用操作。

有46个应用的简述返回了error。这些应用的简述可能超出了字数,而其他的应用则没有问题。考虑到出错的个数仅仅是整个数据集中的一小部分,我们完全可以抛弃掉这些数据。

2 去除非字母字符

现在我们确信诸如日文和中文的简述不会被正则表达式筛除,我们可以创建一个表达式[^a-zA-Z]来返回所有字母和空格。除此之外的其他字符被帮助函数cleaned()中的re.sub()方法去除。空格被保留以用于分词。

3 大写转小写

文本数据正则化的另一步就是将所有字符转化为小写。这一步too simple,只需要对数据帧的相应列运行str.lower()方法即可。

4,5,6 分词,去停用词和词干提取

鉴于这三步已经被nltk实现,我写了一个帮助函数来把它们集成起来。

分词指的是讲一个长句切分成小的块或标识符。这个和使用既定的切分器对一个字符串运行切分函数并得到一个它的各个部分的列表的做法差不多。我们在这里使用nltk包中的word_tokenize()方法来进行分词。

停用词是指可以被过滤掉而不影响文本大意的词。其中包括诸如'a', 'to', 'and'等词。我们通过使用stopwords.words('english')来获得nltk中英文停用词集合。

词干提取指的是去除词的词缀。例如,'climbing'去除词缀变成'climb'。我们使用nltk中的SnowballStemmer('english')来初始化词干提取器。

下面的帮助函数首先将句子分词,然后检查每个词是否为停用词并且过滤停用词,最后运行词干提取器去除词缀并将词加入列表中。

7 数据分析

让我们现在深入已经清洗好的数据。

7.1 词云生成

哪些词被最多地用来描述应用类别呢?尽管使用简单的词频统计或tf-idf vectorizer可以返回词的排名列表,使用词云可能会更加有效地展示那些最常用的词。

为了给每个类别生成一个词云,我为每个建立了一个清洗过的应用简述语料库(或者说是集合)。比较幸运的是,wordcloud包可以很方便地从一个给定语料库生成词云。

wordcloud包通过创建语料库中排名前200的词列表和它们正则化后的词频统计列表来工作。得到词排名的列表后,我们使用Pythin Image库来绘制词云。这个总结并没有对他的代码公正,你可以在下图得到更多相关信息。

取"游戏","天气","购物"和"音乐"的一小部分词为例,我们可以看出,最显著的词其实就是我们所期望的代表其类别的词。但是,尽管在这些类别中效果显著,在其他类别中代表词的区分却不明显。我们将会在下文中聚类时讨论这一点。

7.2 词汇多样性

诸如“游戏“的不同的类别是否本来就有更多样的语言和描述呢?我通过使用一个评估词汇多样性的简单公式来回答这个问题。我用每个过滤列表中的唯一词个数除以相应简述的词总数得到一个数值。这个数值越高就表示词汇多样性越高。

如同预期的一样,“游戏”和“图书”的平均词汇多样性的得分是最高的。可能的原因主要是这两个类别有较多子类别以及它们的简述相对更加“吸引人心”。

而商品指南的描述就可以说是相当的无聊了。

7.3 情感分析

是否存在某些类别的应用简述的态度比其他类别的更加积极?对此我决定用Textblob包来进行情感分析展示。

情感极性为0意味着中立态度,极性小于0表示负面情感,极性大于0表示(你猜对了)正向的情感。

类别“游戏”、“经济”和“医疗“具有最低的平均情感极性。如果游戏内包含有消极主题,例如战争与恐惧(这些主题被很好的体现),"游戏"则可能会有很低的极性。"经济"和"医疗"的极性很低的原因可能是因为其描述了并不乐观的经济或医疗情况。

可能对某几本催人泪下作品的简述构成了“图书”的主要基调。而提到了“捕捉快乐时光”似乎构成了“摄影与录像“的主旋律。

7.4 K均值聚类

现在来到了我们最初的问题——是否能根据应用简述对应用类别进行良好预测?

为了回答这个问题,我对词向量应用可K均值进行聚类并观察它们映射到实际的类别的表现好坏。

当我们设立10个簇并运行聚类算法时,每个簇的前10个词如下图所示:

乍一看的话,似乎某些簇是可以被解释并标记的:

簇0: 面向儿童的应用

簇3: 音乐类应用

簇4: 包含战争/打斗/怪兽的游戏

簇6: 文字游戏

簇7: 摄影与录像应用

簇9:  汽车相关应用

那么这些簇是如何映射到实际中的应用类别的呢?

上面所示的标签看起来具有代表性但是实际上却存在一个问题,在这个样例中,游戏被过度表示了。其他类别的颜色在图表中太浅了以至于几乎没有意义。下图展示了去除了“游戏”后的热图分布。

没有了“游戏”的过度表示后,其他类别的程度就可以清晰识别了。其中较为明显的是簇3和“教育”,簇4和“经济”以及“购物”,簇7和“购物”,还有簇9和“摄影和录像“。

那如果我们将簇的个数增加到与实际类别数相同会怎么样呢(不包含游戏共22个)?

同样,还是先横向比较一下这些簇和各自常用词之间的关系。

在这20个簇中,比较容易定义的簇有:

簇0:购物

簇9:健康&健美

簇10:音乐

簇11:摄影与录像

簇13:教育

簇14:经济

簇17:天气

可以看到,只有三分之一的类别被较好地表示出来,而且其中两个最明显的类别具有很不平衡的样本大小。而且,各个类别之间的词存在重叠现象。导致这些的原因有很多。

不平衡的样本大小

正如一开始所提到的,数据集中大约54%的应用是游戏。即便在将“游戏”类别筛除之后,仍有较大部分游戏被表示在“教育”和“娱乐”类别中。

全都是游戏

如果在所有类别中都挑选一定的样本数量,那么结果可能会更好,但是那样的基础是需要一个更大的整体样本。

词重叠

尽管样本的数量很少,“天气”类应用还是被簇17所表示。那些能够被簇所表示出来的类别是因为其具有独特的命名系统。

且看类别“工具“和”参考“的词云,它们都包含了一些在其他类别中也有所表示的词。

也许可以生成一个列表,其中包含一些跨类别词,并将这个列表中的词从清洗之后的句子中过滤掉。尽管如此,像”效率“和”工具“这样的类别还是有可能和其他类别具有重叠的词,因此无法被完全聚类。

在解决本文的NLP分析里的一些问题后,我想创立一个模型并利用应用简述以及更多的信息来预测应用类别的模型。

我也在尝试使用markovify来生成每个类别的应用简述。这是“体育”类的一些例子:

如你所见,其实也不是特别好(摊手)¯\_(ツ)_/¯

最后,感谢阅读,代码在此

https://github.com/finnqiao/apple_appstore

原文链接:

https://towardsdatascience.com/what-app-descriptions-tell-us-text-data-preprocessing-in-python-afc7ed88360d

点击文末【阅读原文】即可观看更多精彩内容:

介绍一个灵活可重复的强化学习研究的新框架

现代博弈论和多代理式强化学习系统

从 MAX 网站中获取模型,一秒开始你的深度学习应用

实例+代码,你还怕不会构建深度学习的代码搜索库吗

斯坦福CS231n李飞飞计算机视觉经典课程(中英双语字幕+作业讲解+实战分享)

等你来译:

安卓 Smart Links 技术背后的机器学习模型

2018年25家值得关注的机器学习初创企业

剖析深度学习框架

python预处理实例_从 App 描述介绍文字中发掘 Python 文本数据预处理实例相关推荐

  1. python文本数据处理_从 App 描述介绍文字中发掘 Python 文本数据预处理实例

    本文为 AI 研习社编译的技术博客,原标题 What App Descriptions Tell Us: Text Data Preprocessing in Python,作者为 Finn Qiao ...

  2. python set 嵌套_带有路径的嵌套dict中的Python setitem

    程序中有几个语法错误和一个逻辑错误.在 逻辑错误是您使用sample_dict.你有for ...: temp_dict = sample_dict.get(...) 应该是的 ^{pr2}$ 这是你 ...

  3. python数据预处理的方法_文本数据预处理的方法

    文本数据分析(一):基本框架 在文本数据分析基本框架中,我们涉及到了六个步骤: 数据收集 数据预处理 数据挖掘和可视化 模型构建 模型评估 虽然框架需要迭代,但是我们先将其看作是一个线性的过程: 修正 ...

  4. python列表求平均值_长篇文讲解:Python要求O(n)复杂度求无序列表中第K的大元素实例...

    本文内容主要介绍了Python要求O(n)复杂度求无序列表中第K的大元素实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧! 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法 ...

  5. python爬取京东商品数据要先登录_京东商品评论情感分析|文本数据预处理

    本文爬取了十款热销手机的文本评论数据后,首先对文本评论数据做文本预处理,文本评论数据中存在大量的无价值信息,引入无用的文本数据,对其作情感分析,显然没有价值,得出的文本挖掘结果也不尽人意.所以对于文本 ...

  6. python怎么处理数据_python中scrapy处理项目数据的实例分析

    在我们处理完数据后,习惯把它放在原有的位置,但是这样也会出现一定的隐患.如果因为新数据的加入或者其他种种原因,当我们再次想要启用这个文件的时候,小伙伴们就会开始着急却怎么也翻不出来,似乎也没有其他更好 ...

  7. Python 文件操作中的读写模式:open(path, ‘-模式-‘,encoding=‘UTF-8‘)+python读写文件txt +文本数据预处理

    python读写txt文件 文件的打开的两种方式f = open("data.txt","r") #设置文件对象 f.close() #关闭文件#为了方便,避免 ...

  8. python 模糊匹配_很冷门,但非常实用的 Python 库

    Python 是一个很棒的语言.它是世界上发展最快的编程语言之一.它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性.整个 Python 及其库的生态系统使它成为全世界用户(初学者和 ...

  9. 在学Python前学Linux,Python原来这么好学-1.2节: 在Linux中安装python

    这里将告诉您Python原来这么好学-1.2节: 在Linux中安装python,具体操作过程:在Linux系统的主要发行版中,按其软件包格式来进行划分,可分为Deb系以及RPM系操作系统.Linux ...

  10. props传递对象_vue组件中使用props传递数据的实例详解

    在 Vue 中,父子组件的关系可以总结为 props向下传递,事件向上传递.父组件通过 props 给子组件下发数据,子组件通过事件给父组件发送消息.看看它们是怎么工作的. 一.基本用法 组件不仅仅是 ...

最新文章

  1. Kali Linux安装中文输入法
  2. android evaluater_android通过WebView的evaluateJavascript()调用JS
  3. servlet中显示mysql字段_Java Servlet:从数据库获取信息并在屏幕上显示它
  4. [BZOJ 1012] [JSOI 2008] 最大数maxnumber
  5. TwentyEleven暗色系主题实现透明
  6. Shiro学习总结(1)——Apache Shiro简介
  7. AI分析猪叫声中的情绪,“贾维斯”“大白”会不会照进现实?
  8. 算法:回溯解决电话拨号中的字母组合Letter Combinations of a Phone Number
  9. java 日历选择天_如何从Java中的日历对象构建天,月,年的列表?
  10. 计算机组成.就是它在运算.处理器CPU
  11. 利用VideoView实现播放本地和网络视频,滑动快进快退、滑动调整音量和调整亮度,锁定按钮,分享功能,进度显示,双击暂停等功能
  12. 【Vue实用功能】Vue实现tab页多页面切换
  13. 成都传智播客Java培训
  14. 爬虫学的好,牢饭吃得好(爬虫实例)
  15. 06_权限管理(黑)
  16. python 的循环嵌套
  17. 被遗忘的SEO基础知识
  18. linux嵌入式vi使用,嵌入式Linux编辑器vi最基本的使用.doc
  19. 微信小程序时间格式倒计时
  20. civil纵断面如何显示竖向转角?

热门文章

  1. 《3S新闻周刊》第三期发布: 解密Google Earth
  2. 深度学习中RNN、LSTM、GRU等循环神经网络的介绍
  3. Python编写贪吃蛇小游戏
  4. //GPLT L2-2 三足鼎立
  5. UCOS-II移植的基本操作
  6. 弹性云服务器cpu,弹性云服务器CPU积分怎么计算?
  7. html.gmt文件,[转载]使用GMT的psxy命令画各种符号
  8. 请大家注意这些骗局吧!
  9. 网络爬虫框架Scrapy详解之Request
  10. Rust编写Near智能合约