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

Я хочу знать, как лучше всего считать слова в документе. Если у меня есть собственная настройка корпуса «corp.txt», и я хочу знать, как часто в файле «corp.txt» встречаются слова «students, trust, ayre». Что я мог использовать?

Будет ли это одним из следующих:

....
full=nltk.Text(mycorpus.words('FullReport.txt'))
>>> fdist= FreqDist(full)
>>> fdist
<FreqDist with 34133 outcomes>
// HOW WOULD I CALCULATE HOW FREQUENTLY THE WORDS 
"students, trust, ayre" occur in full.

Спасибо, Рэй


person Ray Hmar    schedule 15.11.2011    source источник
comment
Ни один из них не предоставляется стандартной библиотекой Python. Вы уверены, что не думаете о NLTK?   -  person Chris Eberle    schedule 15.11.2011
comment
Глядя на ваше имя, я притворюсь, что вы знаете, что означает "Студенты доверяют Эйре". В любом случае, я бы пошел с FreqDist. fdist = FreqDist(); for word in tokenize.whitespace(sent): fdist.inc(word.lower()). Вы можете ознакомиться с документом здесь .   -  person aayoubi    schedule 15.11.2011
comment
Я отредактировал ответ, пожалуйста, дважды проверьте его для меня. Спасибо   -  person Ray Hmar    schedule 15.11.2011
comment
возможный дубликат Как оптимизировать подсчет слов в Python?   -  person alvas    schedule 07.04.2014


Ответы (4)


Я бы посоветовал заглянуть в collections.Counter. Особенно для больших объемов текста это помогает и ограничивается только доступной памятью. Он насчитал 30 миллиардов токенов за полтора дня на компьютере с 12 ГБ оперативной памяти. Псевдокод (переменные слова на практике будут ссылкой на файл или что-то подобное):

from collections import Counter
my_counter = Counter()
for word in Words:
    my_counter.update(word)

По завершении слова находятся в словаре my_counter, который затем можно записать на диск или сохранить в другом месте (например, sqlite).

person Lars GJ    schedule 06.04.2014

Большинство людей просто используют defaultdictionary (со значением по умолчанию 0). Каждый раз, когда вы видите слово, просто увеличивайте значение на единицу:

total = 0
count = defaultdict(lambda: 0)
for word in words:
    total += 1
    count[word] += 1

# Now you can just determine the frequency by dividing each count by total
for word, ct in count.items():
     print('Frequency of %s: %f%%' % (word, 100.0 * float(ct) / float(total)))
person Chris Eberle    schedule 15.11.2011
comment
Вы имеете в виду defaultdict(int) -- defaultdict принимает callable. - person kindall; 16.11.2011
comment
@ Крис, как насчет использования Counter? - person alvas; 07.04.2014

Вы почти там! Вы можете проиндексировать FreqDist, используя интересующее вас слово. Попробуйте следующее:

print fdist['students']
print fdist['ayre']
print fdist['full']

Это дает вам количество или количество вхождений каждого слова. Вы сказали «как часто» - частота отличается от количества вхождений - и это может выглядеть так:

print fdist.freq('students')
print fdist.freq('ayre')
print fdist.freq('full')
person Spaceghost    schedule 11.07.2012

Вы можете прочитать файл, затем разметить и поместить отдельные токены в объект FreqDist в NLTK, см. http://nltk.googlecode.com/svn/trunk/doc/api/nltk.probability.FreqDist-class.html

from nltk.probability import FreqDist
from nltk import word_tokenize

# Creates a test file for reading.
doc = "this is a blah blah foo bar black sheep sentence. Blah blah!"
with open('test.txt', 'w') as fout:
    fout.write(doc)

# Reads a file into FreqDist object.
fdist = FreqDist()
with open('test.txt', 'r') as fin:
    for word in word_tokenize(fin.read()):
        fdist.inc(word)

print "'blah' occurred", fdist['blah'], "times"

[из]:

'blah' occurred 3 times

Кроме того, вы можете использовать нативный объект Counter из collections, и вы получите те же подсчеты, см. https://docs.python.org/2/library/collections.html. Обратите внимание, что ключи в объекте FreqDist или Counter чувствительны к регистру, поэтому вы также можете захотеть сделать токенизацию строчными буквами:

from collections import Counter
from nltk import word_tokenize

# Creates a test file for reading.
doc = "this is a blah blah foo bar black sheep sentence. Blah blah!"
with open('test.txt', 'w') as fout:
    fout.write(doc)

# Reads a file into FreqDist object.
fdist = Counter()
with open('test.txt', 'r') as fin:
    fdist.update(word_tokenize(fin.read().lower()))

print "'blah' occurred", fdist['blah'], "times"
person alvas    schedule 07.04.2014