所以基本上我有一个数据帧,看起来像:
user_id, comment
0, 'Functional but Horrible UI'
1, 'Great everything works well'
2, 'I struggled finding plus button because of theme colors in dark mode'
3, 'Keeps stopping on Android 10'
4, 'I like the functionaity but color theme could be better'
5, 'Consistently crashing. Uninstalled'
6, 'Good overall'
7, 'sfdfsdlfksd'
8, 'I lost in complex settings'
9, 'Configuring app is really a headache'
10, 'aaaaaaaaaaaaa'
我想找出一些数据科学的方法来提取用户正在挣扎的信息,以及哪些问题出现了多少,诸如此类的信息。即使是一些简单的输出对我来说也很好,这样我们就知道应该更多地关注应用程序的哪些部分。就像上面的例子一样,我的目标是输出简单到:
problems = {
'color_theme': 3,
'app_settings': 2,
'crashing' : 2}
所以我有点想根据评论所属的标签来标记,以及标记发生的时间。为此,我一直在使用手动投掷评论,并了解它的意义,为相关错误添加计数,或者如果它不存在,则提交它,随着应用程序评论数量的不断增加,这并没有变得更容易。同样的问题是,我不能用预定义的标签训练模型,因为:
我没有评论标签。如果我们必须通过每次审查来了解它在谈论什么问题(即给它贴标签),我们也会提交它,并知道我们必须做什么。
我事先不知道未来会出现什么问题,所以即使我们在某个时间点以某种方式给所有问题贴上标签,这也不够,因为一些看不见的问题可能会出现,我们必须再次这样做。
即使我们有一个标签系统,我们将如何更新模型,就像我们定义一个具有不同架构的新模型来适应不断变化的标签一样?
所以在这种情况下,我试图找到一种AI方法来缓解我的处境。我非常擅长python,并且对keras/tensorflow和其他库有一定的了解,但它们似乎都没有这样灵活的模型方法。我也浏览了谷歌云平台的人工智能平台,但它可以在一定程度上进行情绪分析,但在应用程序上下文中无法理解,例如按钮也是UI和颜色的一部分。那么,我该如何以一种更优雅的方式来处理这个问题呢?
附言:这不仅仅是情绪分析,因为当我讨论这个问题时,我经常得到这样的回应。我真的只关心负面评价,所以过滤可能是这样,但实际目标是收集每个问题对用户的困扰程度以及有多少用户受到影响的信息,所以情况并非如此。那么回到问题上来:
如何将新的问题/错误标签分配或添加到不断增加的评论集合中进行分析
有多个问题需要解决:
- 查找实际描述问题的示例。因此,不仅仅是"整体良好",更像是"功能性但可怕的UI">
- 查找准确的类别(如UI、崩溃等)
- 将数据分类到没有标记数据的类别中
- 为新数据重做2和3
详细问题:
1.可能是直接的,您可以使用情绪分析,也可以通过某种主动学习算法将其分类为相关-未发布。例如,有一个用于主动学习的python库。
2。难度更大。您需要实际查看数据(只查看由1.过滤的数据),可能需要使用一些聚类算法,并使用您的领域知识来识别有用的类别。
3。与1相同。但是具有不同的标签并且仅在由1过滤的数据上。通过使用主动学习,你实际上并不需要标记的数据,但当模型要求时,你会给它们添加标签。这会导致多标签分类。使用多标签分类,样本可能没有标记任何类别。让我们称之为"无类别"样本。
4.现在您有了一个将数据分类的管道。偶尔,您必须检查"无类别"示例的列表,然后重做2。在那些"无类别"样本中,是否有一些有用的新类别?如果是,请将新类别添加到标签集中,然后(重新)训练多标签分类。如果你使用了一对一的方法,你可以简单地添加新的模型,而不需要重新训练现有的模型。我想这一步很难自动化,因为识别有用的类别需要领域知识。在生产环境中,如果有一定数量的新"无类别"示例,我可能会安装电子邮件通知。每100个新的"无类别",你就会查看数据并确定可能的新类别。
使用集群进行自动分类
以下是如何使用Tensorflow的句子特征提取和Sklearns自动聚类来聚类信息的示例
首先让我们设置导入和数据
import tensorflow_hub as hub
model = hub.KerasLayer("https://tfhub.dev/google/nnlm-en-dim128/2")
你可以在线阅读关于tensorflow hub的所有信息。它为语言和图像提供了预先训练的模型。基本上,我们将使用它从你的句子中提取128个特征。我不知道这些特征是什么,但它们本质上是"语义"的,所以只将一个句子的特征与另一个句子进行比较以获得相似性就足够了。
现在查看您的数据。我又添加了一些类似的例子。
data = ['Functional but Horrible UI', 'Really bad UI but works', 'hate the UI but functions',
'Great everything works well', 'plus plus on it all working nicely', 'it all works like I expect',
'I struggled finding plus button because of theme colors in dark mode', 'dark mode isnt good for my eyes'
'Keeps stopping on Android 10', 'the Android 10 install crashes', 'what is with Android 10 not work'
'I like the functionaity but color theme could be better', 'better colours please', 'what is with the horrible colors?'
'Consistently crashing. Uninstalled', 'crashes all the time', 'why u crash so much ... crash crash crash',
'Good overall', 'good', 'works', 'overall it is good',
'sfdfsdlfksd',
'I lost in complex settings',
'Configuring app is really a headache',
'aaaaaaaaaaaaa']
接下来,我们使用该模型从每个句子中获得特征
data_as_latent = model(data).numpy()
data_as_latent.shape
# (22, 128)
现在我们使用sklearn来对句子进行聚类。我首先使用TruncatedVD将数据的维数从128降到12。原因是BayesianGaussianMixture(集群代码)在很多维度的中都做得不好
from sklearn.decomposition import TruncatedSVD
from sklearn.mixture import BayesianGaussianMixture
def reduceDimensions(latents):
svd = TruncatedSVD(n_components=12)
svd.fit(latents)
return svd.transform(latents).tolist()
def cluster(data_as_latent, clusters=4):
bgm = BayesianGaussianMixture(n_components=clusters)
bgm.fit(data_as_latent)
return bgm.predict(data_as_latent)
data_as_smaller = reduceTo2D(data_as_latent)
data_as_cluster = cluster(data_as_smaller)
现在我们得到了输出,看到了魔术!
for phrase,cluster in zip(data,data_as_cluster):
print(f'Assigned cluster {cluster} to phrase : {phrase}')
Assigned cluster 0 to phrase : Functional but Horrible UI
Assigned cluster 0 to phrase : Really bad UI but works
Assigned cluster 0 to phrase : hate the UI but functions
Assigned cluster 0 to phrase : Great everything works well
Assigned cluster 3 to phrase : plus plus on it all working nicely
Assigned cluster 3 to phrase : it all works like I expect
Assigned cluster 3 to phrase : I struggled finding plus button because of theme colors in dark mode
Assigned cluster 2 to phrase : dark mode isnt good for my eyesKeeps stopping on Android 10
Assigned cluster 0 to phrase : the Android 10 install crashes
Assigned cluster 2 to phrase : what is with Android 10 not workI like the functionaity but color theme could be better
Assigned cluster 1 to phrase : better colours please
Assigned cluster 2 to phrase : what is with the horrible colors?Consistently crashing. Uninstalled
Assigned cluster 0 to phrase : crashes all the time
Assigned cluster 0 to phrase : why u crash so much ... crash crash crash
Assigned cluster 1 to phrase : Good overall
Assigned cluster 1 to phrase : good
Assigned cluster 0 to phrase : works
Assigned cluster 1 to phrase : overall it is good
Assigned cluster 0 to phrase : sfdfsdlfksd
Assigned cluster 0 to phrase : I lost in complex settings
Assigned cluster 2 to phrase : Configuring app is really a headache
Assigned cluster 0 to phrase : aaaaaaaaaaaaa
看起来集群比随机要好一点。有了更多的例子,集群会更好地工作。
处理异常值
您可以使用非常相似的技术来处理异常值,但使用不同的Sklearn函数。这是我制作的视频https://youtu.be/rGRS-fbpbB4这显示了其中的细节。
查找与其他短语相似的短语
假设我们想找到所有与crashes all the time
真正相似的短语。我们可以使用余弦相似度来找到具有非常相似的潜在空间的句子,比如:
import scipy
similarity = scipy.spatial.distance.cosine
reference = model(['crashes all the time']).numpy()[0]
scores = [similarity(reference,value) for value in data_as_latent]
for phrase,score in sorted( list(zip(data,scores)), key=lambda x: x[1]):
print(f'Score {int(100 - score*100)} to phrase : {phrase}')
你的结果看起来像这个
Score 100 to phrase : crashes all the time
Score 49 to phrase : hate the UI but functions
Score 48 to phrase : why u crash so much ... crash crash crash
Score 37 to phrase : the Android 10 install crashes
Score 28 to phrase : I struggled finding plus button because of theme colors in dark mode
Score 28 to phrase : it all works like I expect
Score 26 to phrase : plus plus on it all working nicely
Score 26 to phrase : Great everything works well
Score 21 to phrase : Really bad UI but works
Score 21 to phrase : what is with Android 10 not workI like the functionaity but color theme could be better
Score 20 to phrase : Configuring app is really a headache
Score 18 to phrase : I lost in complex settings
Score 17 to phrase : what is with the horrible colors?Consistently crashing. Uninstalled
Score 15 to phrase : dark mode isnt good for my eyesKeeps stopping on Android 10
Score 14 to phrase : Good overall
Score 13 to phrase : overall it is good
Score 10 to phrase : good
Score 10 to phrase : works
Score 9 to phrase : sfdfsdlfksd
Score 4 to phrase : better colours please
Score 3 to phrase : Functional but Horrible UI
Score -26 to phrase : aaaaaaaaaaaaa