如何在数据帧中操纵来自googleautoml的预测响应?

2024-09-21 03:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经成功地训练了一个googleautoml自然语言模型来使用自定义标签对文本进行多标签分类。你知道吗

我还能够使用经过训练的数据集生成的python函数对Jupyter笔记本中Pandas数据框中包含的文本生成预测。你知道吗

但是我不知道如何使用结果,尤其是如何操作它,以便对我有用。你知道吗

下面是我的代码当前的样子:

r = #api call to get text
df = pd.read_csv(StringIO(r.text), usecols=['text_to_predict'])
df['Category_Predicted'] = df.apply(lambda row: get_prediction(row.review, 'xxx', 'xxxx')

df['Category\u Predicted'].head()的输出为

0    payload {\n  classification {\n    score: 0.61...
Name: Category_Predicted, dtype: object

一个简单的(可读性更强的)预测结果

payload {
  classification {
    score: 0.6122230887413025
  }
  display_name: "Shopping"
}
payload {
  classification {
    score: 0.608892023563385
  }
  display_name: "Search"
}
payload {
  classification {
    score: 0.38840705156326294
  }
  display_name: "Usability"
}
payload {
  classification {
    score: 0.2736874222755432
  }
  display_name: "Stability"
}
payload {
  classification {
    score: 0.011237740516662598
  }
  display_name: "Profile"
}
#......................(continues on for all categories)

现在,我的主要目标是让df['Category\u expected']成为一个字段,其中最顶层(最相关)的类别在一个简单的列表中用逗号分隔。上面的例子是

Shopping, Search, Usability

(取决于您希望根据分数保留标签的距离)

所以我手上有几个:

  • 如何使用python访问此字段以获取类别及其相关分数?

  • 如何操作它来创建单个字符串?

谢谢!你知道吗

编辑

根据评论中的要求,下面的一些示例表示我的数据帧中的2条记录(非完整)有效负载,其中在所需结果中,我过滤了得分大于0.3的结果。由于文本字段太大,我不得不使用用于表示而不是ascii表的“自定义”解决方案

第1行-预测文本

到目前为止应用程序很棒。只是遗憾的是,你不能在旧的应用程序中看到你仍然在你的购物或你的最爱是什么。这个事实已经不复存在了。再加上,你现在必须进入新的一切!!!

第1行-预测输出

payload {
  classification {
    score: 0.6122230887413025
  }
  display_name: "Shopping"
}
payload {
  classification {
    score: 0.608892023563385
  }
  display_name: "Search"
}
payload {
  classification {
    score: 0.38840705156326294
  }
  display_name: "Usability"
}
payload {
  classification {
    score: 0.2736874222755432
  }
  display_name: "Stability"
}

第1行-所需输出

购物、搜索、可用性

第2行-预测文本

第二次你让我们觉得一个新应用程序的笑话比第一次更糟糕。多久之后用这个程序升级?一点也不直观,不太清楚。。。简言之,不是上一个的水平

第2行-预测输出

payload {
  classification {
    score: 0.9011210203170776
  }
  display_name: "Usability"
}
payload {
  classification {
    score: 0.8007309436798096
  }
  display_name: "Shopping"
}
payload {
  classification {
    score: 0.5114057660102844
  }
  display_name: "Stability"
}
payload {
  classification {
    score: 0.226901113986969
  }
  display_name: "Search"
}

第2行-所需输出

可用性、购物、稳定性


Tags: 数据textname文本dfsearchdisplay标签
2条回答

我从你的问题中了解到的是,你想要的是最相关的类别。我将您的预测字符串输出放在一个文本文件中,例如out.txt

import pandas as pd
df = pd.read_csv('out.txt',
             header=None,
             delim_whitespace=True,
             names=['data'])
score = df.loc['score:']['data'].values
category = df.loc['display_name:']['data'].values
score_category = zip(score,category)
for category in sorted(list(score_category), key=lambda x:x[0], reverse=True):
    print(category[1], end=", ")

对于上述共享的预测结果,得到了结果:你知道吗

Shopping, Search, Usability, Stability, Profile,

我知道回答我自己的问题是不好的,但我想如果有人寻找同样的问题,他们可能会找到解决办法。你知道吗

作为google.cloud.automl\u v1beta1定义它,方法get\u prediction的返回值是PredictResponse(https://cloud.google.com/natural-language/automl/docs/reference/rpc/google.cloud.automl.v1beta1#predictresponse)类型的对象

通过使用此类对象的文档和可用结构,我发现这段代码可以做到这一点

for index, row in df.iterrows():
    pred = get_prediction(row['review'], GCP_PROJ, AUTOML_DS)
    filteredCategories = filter(filterPrediction, pred.payload)
    df.at[index,'Predicted_Categories'] = ",".join([str(categ.display_name) for categ in filteredCategories])

相关问题 更多 >

    热门问题