Как получить самое частое слово из корпуса?

Я работаю с корпусами и хочу получить наиболее и наименее используемый класс слов и слов из корпуса. У меня есть начало кода, но я получаю некоторые ошибки, с которыми я не знаю, как справиться. Я хочу получить наиболее часто встречающееся слово из коричневого корпуса, а затем наиболее и наименее употребляемые классы слов. У меня есть этот код:

import re
import nltk
import string
from collections import Counter
from nltk.corpus import stopwords
from collections import defaultdict, Counter
from nltk.corpus import brown

brown = nltk.corpus.brown
stoplist = stopwords.words('english')

from collections import defaultdict

def toptenwords(brown):
    words = brown.words()
    no_capitals = ([word.lower() for word in words])
    filtered = [word for word in no_capitals if word not in stoplist]
    translate_table = dict((ord(char), None) for char in string.punctuation)
    no_punct = [s.translate(translate_table) for s in filtered]
    wordcounter = defaultdict(int)
    for word in no_punct:
        if word in wordcounter:
            wordcounter[word] += 1
        else:
            wordcounter[word] = 1
    sorting = [(k, wordcounter[k])for k in sorted(wordcounter, key = wordcounter.get, reverse = True)]
    return sorting

print(toptenwords(brown))

words_2 = [word[0] for word in brown.tagged_words(categories="news")]
# the most frequent words
print Counter(words_2).most_common(10)

words_2 = [word[1] for word in brown.tagged_words(categories="news")]
# the most frequent word class
print Counter(words_2).most_common(10)


# Keeps words and pos into a dictionary
# where the key is a word and
# the value is a counter of POS and counts
word_tags = defaultdict(Counter)
for word, pos in brown.tagged_words():
word_tags[word][pos] +=1

# To access the POS counter.
print 'Red', word_tags['Red']
print 'Marlowe', word_tags['Marlowe']
print

# Greatest number of distinct tag.
word_with_most_distinct_pos = sorted(word_tags, key=lambda x: len(word_tags[x]), reverse=True)[0]

print word_with_most_distinct_pos
print word_tags[word_with_most_distinct_pos]
print len(word_tags[word_with_most_distinct_pos])

# which word has the greatest number of distinct tags
word_tags_2 = nltk.defaultdict(lambda: set())
for word, token in tagged_words:
    word_tags[word].add(token)
    ambig_words = sorted([(k, len(v)) for (k, v) in word_tags.items()]),
    key=itemgetter(1), reverse=True)[:50]
  print [(word, numtoks, word_tags[word]) for (word, numtoks) in ambig_words]

Когда я запускаю код выше, я получаю ошибки ниже:

File "Oblig2a.py", line 64
    key=itemgetter(1), reverse=True)[:50]
                               ^
SyntaxError: invalid syntax

Из этого кода я хотел бы получить:

  1. Самое частое слово
  2. Самое частое слово в классе
  3. Наименее частое слово класс
  4. Сколько слов с более чем одним словом класса
  5. Какое слово имеет наибольшее количество тегов, и сколько существует различных тегов
  6. Последнее, что мне нужно, - это написать функцию для конкретного слова и написать, сколько раз оно встречается с каждым из тегов. Я пытаюсь сделать это выше, но я не могу заставить его работать...

Это номер 3, 4, 5 и 6, в которых мне нужна помощь... Любая помощь будет приветствоваться.

1 ответ

Есть 3 проблемы с кодом:

  1. Ошибка, которую говорит вам переводчик - вы должны указать название языка для функции стоп-слов: stoplist = stopwords.words('english')
  2. использование defaultdict толковый словарь get способ правильно отсортировать диктовку: [(k, wordcounter[k])for k in sorted(wordcounter, key = wordcounter.get, reverse = True)]
  3. Используйте таблицу перевода для данных Unicode, см. String.translate() с данными Unicode в Python
  4. Слова с тегами Браун - это кортежи в формате (word, part-of-speech)

Полный код:

import re
import nltk
import string
from collections import Counter
from nltk.corpus import stopwords

brown = nltk.corpus.brown
stoplist = stopwords.words('english')

from collections import defaultdict

def toptenwords(brown):
    words = brown.words()
    no_capitals = set([word.lower() for word in words])
    filtered = [word for word in no_capitals if word not in stoplist]
    translate_table = dict((ord(char), None) for char in string.punctuation)
    no_punct = [s.translate(translate_table) for s in filtered]
    wordcounter = defaultdict(int)
    for word in no_punct:
        if word in wordcounter:
            wordcounter[word] += 1
        else:
            wordcounter[word] = 1
    sorting = [(k, wordcounter[k])for k in sorted(wordcounter, key = wordcounter.get, reverse = True)]
    return sorting


print(toptenwords(brown))

words_2 = [word[0] for word in brown.tagged_words(categories="news")]
# the most frequent words
print Counter(words_2).most_common(10)

words_2 = [word[1] for word in brown.tagged_words(categories="news")]
# the most frequent word class
print Counter(words_2).most_common(10)
Другие вопросы по тегам