我正在使用gensim进行实验.我正在使用lda模型来获得一个概率向量,如下所示:
[(0, 0.01666666666666804), (1, 0.01666666666666982), (2, 0.01666666666667857), (3, 0.016666666666667104), (4, 0.016666666666668519), (5, 0.01666666666666838), (6, 0.016666666666681464), (7, 0.016666666666669494), (8, 0.016666666666669269), (9, 0.016666666666667069), (10, 0.016666666668398125), (11, 0.016666666666666666), (12, 0.51666666666481131), (13, 0.01666666666668485), (14, 0.01666666666666948), (15, 0.016666666666667097), (16, 0.016666666666666666), (17, 0.016666666666666767), (18, 0.016666666666667922), (19, 0.016666666666678695), (20, 0.016666666666667683), (21, 0.016666666666677307), (22, 0.016666666666669522), (23, 0.016666666666675913), (24, 0.016666666666670923), (25, 0.016666666666667409), (26, 0.016666666666680405), (27, 0.016666666666666666), (28, 0.0166666666666705), (29, 0.016666666666668353)]
它是由元组组成的列表,元组的第一个组成部分是主题,第二个是概率:
(topic, probability)
我想在元组列表中获得具有最高概率的5个主题,如下所示:
max = [(topicN, probability),...]
我尝试首先将这个元组转换为numpy结构,如下所示:
vector = lda[ques_vec] print(vector) types = numpy.dtype('int,float') data = numpy.array(vector,dtype=types) print(data)
但是我不知道如何命令这个结构来获得具有最高概率的五个元组的列表,所以我想感谢支持.
内置heapq
模块包含一个nlargest
功能:
from heapq import nlargest from operator import itemgetter >>> nlargest(5, vector, key=itemgetter(1)) # get the 5 largest values based on the second item in each tuple [(12, 0.5166666666648113), (10, 0.016666666668398125), (13, 0.01666666666668485), (6, 0.016666666666681464), (26, 0.016666666666680405)]
或者您可以使用带切片的反向排序:
>>> sorted(vec, key=itemgetter(1), reverse=True)[:5] [(12, 0.5166666666648113), (10, 0.016666666668398125), (13, 0.01666666666668485), (6, 0.016666666666681464), (26, 0.016666666666680405)]
但是这两种方法都不需要numpy
.
它也可以使用numpy,但是我能提出的方法需要一些中间步骤:
>>> types = np.dtype('int, float') >>> data = np.array(vector, dtype=types) >>> np.sort(data, order='f1')[-5:][::-1] array([(12, 0.5166666666648113), (10, 0.016666666668398125), (13, 0.01666666666668485), (6, 0.016666666666681464), (26, 0.016666666666680405)], dtype=[('f0', '这使用
np.sort
基于第二列(order='f1'
),然后获取最后5个项目(numpy仅支持从低到高的排序)[-5:]
并最终反转剩余的项目([::-1]
).需要注意的是
np.sort
:默认情况下,它使用非稳定的排序算法(Quicksort).因此,如果您希望具有相同概率的多个值,则可能需要稳定排序,那么您应该指定kind='mergesort'
.还有另一种使用numpy的方法,它不需要完整的排序
np.partition
:>>> types = np.dtype('int, float') >>> data = np.array(vector, dtype=types) >>> np.partition(data, -5, order='f1')[-5:][::-1] array([(12, 0.5166666666648113), (10, 0.016666666668398125), (13, 0.01666666666668485), (6, 0.016666666666681464), (26, 0.016666666666680405)], dtype=[('f0', '然而,
partition
支持没有稳定的算法,所以它可能更快,但它绝对不那么灵活.