我正在编写一段代码,根据它们的相关性返回前10个文档。但是我遇到了错误。我认为发生错误的代码是sorted_disc_max_10:
#sort the term frequency values in ascending order
sorted_dic = sorted(tf.items(), key=operator.itemgetter(1), reverse=True)
sorted_disc_max_10 = heapq.nlargest(10, sorted_dic,key=lambda s: range(1))
#print the top 10 document IDs with the most f-idf weighting of a term
for value in sorted_disc_max_10:
print (value[0])
我收到的错误消息是:
TypeError:“ range”和“ range”的实例之间不支持“ <”
关于如何解决此问题的任何想法?预先谢谢你!
答案 0 :(得分:2)
这正是错误发生的地方。实际上,它发生在lambda s: range(1)
中。通常,key
参数提供一个函数,该函数接受一个项目并返回一个值以对其进行排序。例如:
from collections import namedtuple
Person = namedtuple('Person', 'name age')
people = [
Person('Bob', 35),
Person('Sarah', 31),
Person('Jane', 42),
]
people_sorted_by_age = sorted(people, key=lambda p: p.age)
在您的情况下,key=lambda s: range(1)
返回range(1)
作为要对sorted_dic
中的每个项目进行比较的值。这实际上没有任何意义,因为使用常量值作为键不会随机播放任何项目(因此不会进行排序),但由于错误表明您无法比较range
个对象:
>>> range(10) < range(1)
Traceback (most recent call last):
...
TypeError: '<' not supported between instances of 'range' and 'range'
在后台,nlargest
正在使用<
比较键值。但是无论如何,比较范围确实没有任何意义。您可能想通过其他方式进行比较。
但是在上一行中,您已经拥有tf
中按item[1]
(for item in tf
)排序的项目,因此您可能根本不需要nlargest
。已经排序了。
但是,如果您只需要最大的10个,则使用nlargest
而不是进行排序以获得更有效的排序(因为它不会对整个列表进行排序):
sorted_dic = heapq.nlargest(10, tf.items(), key=operator.itemgetter(1))
如果tf
中没有很多项目,sorted
通常是比较惯用的方法。如果您想走那条路线,则可以从中剔除前10个项目:
sorted_dic = sorted(tf.items(), key=operator.itemgetter(1), reverse=True)[:10]