Python NLTK — создание «словаря» из корпуса и сохранение числовых тегов

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

Я хочу просмотреть весь корпус и сделать словарь, содержащий каждое слово, которое появляется в наборе данных корпуса. Я хочу иметь возможность затем искать слово в этом словаре и находить, сколько раз это слово появлялось в качестве части речи (тега). Так, например, если бы я искал «собака», я мог бы найти 100 тегов существительных и 5 тегов глаголов и т. д.

Конечная цель состоит в том, чтобы сохранить этот файл извне как .txt или что-то в этом роде и загрузить его в другую программу, чтобы проверить вероятность того, что слово является тегом.

Сделал бы я это с помощью Counter и ngrams?


person Nate Cook3    schedule 07.06.2015    source источник


Ответы (1)


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

>>> from nltk.corpus import brown
>>> wordcounts = nltk.ConditionalFreqDist(brown.tagged_words())
>>> wordcounts["set"].tabulate(10)
VBN   VB   NN  VBD VBN-HL NN-HL 
159   88   86   71    2    2 

ConditionalFreqDist — это, по сути, словарь объектов Counter с некоторыми дополнениями. Посмотрите его в документации NLTK.

PS. Если вы хотите нормализовать регистр слов перед подсчетом, используйте

wordcounts = nltk.ConditionalFreqDist((w.lower(), t) for w, t in brown.tagged_words())
person alexis    schedule 07.06.2015
comment
Хорошо, кажется, это работает очень хорошо! Спасибо! Могу ли я использовать json для печати содержимого подсчета слов в текстовый файл? - person Nate Cook3; 07.06.2015
comment
json.dump(wordcounts, open(corpus_dict.txt,'w')) выводит текстовый файл ерунды. Я предполагаю, что это потому, что это набор объектов? - person Nate Cook3; 07.06.2015
comment
Я бы не знал. Я был бы очень удивлен, если бы json не обрабатывал вложенные словари, и это все, что они есть. - person alexis; 07.06.2015
comment
Хорошо, мне было любопытно; Я попробовал это, и это выглядит совершенно законно. Попробуйте dump = json.dumps(wordcounts) и напечатайте dump[:100] - person alexis; 07.06.2015
comment
Интересно, я могу распечатать дамп[:100] в txt-файл, и он выдаст несколько {\fawn\: {\NN\: 1}, \Ranavan\... но когда я печатаю весь дамп, похоже, что текст написано поверх текста - person Nate Cook3; 08.06.2015
comment
Вы уверены, что вывод недействителен? Пробовали перезагружать? (Если он просто выглядит недействительным, попробуйте его загрузить). - person alexis; 08.06.2015
comment
текст, записываемый поверх текста, не является возможной проблемой при записи в файл. По умолчанию json Python не добавляет новые строки или отступы, так что вы, вероятно, ни о чем не беспокоитесь. - person alexis; 08.06.2015