0

在使用以下 def 查找语料库中最常用的 10 个单词(使用 Python)后,我必须比较这 10 个单词在所述语料库的不同子类别中的上下文。

def meest_freq(mycorpus):
    import string
    woorden = mycorpus.words()
    zonderhoofdletters = [word.lower() for word in woorden]
    filtered = [word for word in zonderhoofdletters if word not in stopList]
    no_punct = [s.translate(None, string.punctuation) for s in filtered]
    word_counter = {}
    D = defaultdict(int)
    for word in no_punct:
        D[word] +=1
    popular_words = sorted(D, key = D.get, reverse = True)
    woord1 = popular_words[1]
    woord2 = popular_words[2]
    woord3 = popular_words[3]
    woord4 = popular_words[4]
    woord5 = popular_words[5]
    woord6 = popular_words[6]
    woord7 = popular_words[7]
    woord8 = popular_words[8]
    woord9 = popular_words[9]
    woord10 = popular_words[10]
    print "De 10 meest frequente woorden zijn: ", woord1, ",", woord2, ',', woord3, ',', woord4, ',', woord5, ',', woord6, ',', woord7, ',', woord8, ',', woord9, "en", woord10
    return popular_words

我想使用以下代码来做到这一点:

def context(cat):
    words = popular_words[:10]
    context = words.concordance()
    print context

不幸的是,我不断收到“AttributeError:'str'对象没有属性'concordance'有谁知道为什么我不能在第二个def中使用我的第一个代码块的结果?我认为应该使用return-statement能工作。

4

1 回答 1

1

有谁知道为什么我不能在第二个 def 中使用我的第一个代码块的结果?我认为通过使用返回语句它应该能够工作。

因为函数不返回变量,所以它们返回值

popular_words您使用的context 不是来自meest_freq;它来自某个地方的某个全局变量。里面meest_freqpopular_words是本地人。这是因为规则:如果您在函数内分配名称,则它是本地名称,除非您在语句中另有global说明。在context中,没有对 的赋值popular_words,因此 Python 会寻找具有该名称的全局变量。这个全局包含一些你不希望它包含的东西,可能是因为你正在测试解释器中的函数(也许你在测试和修复以前版本的函数时留下了它......)。

请不要尝试为此使用全局变量。您已经正确地吸取了教训,从函数中获取信息的方法是通过返回值。与之对应的;将信息获取函数中的方法是将其作为参数传入。meest_freq与了解语料库的方式相同(因为您将其传递为mycorpus),因此context应该注意流行词。

您必须在某个地方拥有调用这两个函数的代码。该代码应该获取从 中返回的meest_freq,并将其传递给context,就像将语料库传递给 一样meest_freq

或者,如果您将语料库传递给context,那么您可以在那里进行调用。因为你的名字,很难知道什么是组织事物的正确方式;我不知道cat应该是什么意思,或者context与任何事情有什么关系,或者concordance在这种情况下意味着什么。

于 2013-01-24T12:39:22.240 回答