0

对于我的家庭作业,我需要分离出文本中出现频率最高的 50 个单词。我已经尝试了很多东西,在我最近的尝试中,我用这个做了一个索引:

concordance = {}

lineno = 0

for line in vocab:

    lineno = lineno + 1

    words = re.findall(r'[A-Za-z][A-Za-z\'\-]*', line)
    for word in words: 
        word = word.title()
        if word in concordance:
            concordance[word].append(lineno)
        else: 
            concordance[word] = [lineno]
listing = []

for key in sorted(concordance.keys()):

    listing.append( [key, concordance[key] ])

我想知道的是,我是否可以将后续的索引按照最常用词到最不常用词的顺序进行排序,然后隔离并打印前50个?我不允许导入除reand以外的任何模块sys,我正在努力想出一个解决方案。

4

2 回答 2

1

sorted是一个不需要导入的内置函数。尝试类似:

list(sorted(concordance.items(), key = lambda (k,v): v))[:50]

未经测试,但你明白了。

构造list函数在那里是因为sorted返回一个生成器,您不能直接对其进行切片(itertools提供了一个实用程序来执行此操作,但您不能导入它)。

可能有更有效的方法来获取前 50 个,但我怀疑它在这里是否重要。

于 2012-05-16T12:24:01.517 回答
0

几个提示:

  • 在您的 for 循环中使用enumerate(list)以一次获取行号和行。
  • 尝试\w在正则表达式中使用 for word 字符而不是 list [A-Za-z...]
  • 阅读该dict.items()方法。它将返回一个(key, value)对列表。
  • 用 操作该列表list.sort(key=function_to_compare_two_items)
  • 您可以使用 a 定义该函数lambda,但这不是必需的。
  • 使用该len(list)函数获取列表的长度。您可以使用它来获取单词的匹配数(存储在列表中)。
  • 更新:哦,是的,并使用切片来获取结果列表的一部分。list[:50]获取前 50 个项目(相当于list[0:50]),并list[5:10]获取从索引 5(含)到索引 10(不含)的项目。
  • 要打印它们,请遍历结果列表,然后打印每个单词。或者,您可以使用类似的东西print '[separator]'.join(list)来打印一个字符串,其中所有项目都由“[分隔符]”分隔。

祝你好运。

于 2012-05-16T12:50:38.657 回答