Подсчет (и запись) частот слов для каждой строки в текстовом файле - PullRequest
3 голосов
/ 08 апреля 2011

при первой публикации в стеке - всегда находил предыдущие вопросы, способные решить мою проблему! Основная проблема, которую я имею, - это логика ... даже ответ с псевдокодом был бы великолепен.

Я использую python для чтения данных из каждой строки текстового файла в формате:

This is a tweet captured from the twitter api #hashtag http://url.com/site

Используя nltk, я могу токенизировать по строке, а затем использовать reader.sents () для перебора и т. Д .:

reader = TaggedCorpusReader(filecorpus, r'.*\.txt', sent_tokenizer=Line_Tokenizer())

reader.sents()[:10]

Но я бы хотел посчитать частоту определенных «горячих слов» (хранящихся в массиве или подобном) в каждой строке, а затем записать их обратно в текстовый файл. Если бы я использовал reader.words (), я мог бы подсчитать частоту «горячих слов» во всем тексте, но я ищу количество в строке (или «предложение» в данном случае).

В идеале, что-то вроде:

hotwords = (['tweet'], ['twitter'])

for each line
     tokenize into words.
     for each word in line 
         if word is equal to hotword[1], hotword1 count ++
         if word is equal to hotword[2], hotword2 count ++
     at end of line, for each hotword[index]
         filewrite count,

Кроме того, не стоит беспокоиться о том, что URL может быть поврежден (использование WordPunctTokenizer удалит пунктуацию - это не проблема)

Было бы здорово использовать любые полезные указатели (включая псевдо или ссылки на другой подобный код).

---- РЕДАКТИРОВАТЬ ------------------

Закончилось делать что-то вроде этого:

import nltk
from nltk.corpus.reader import TaggedCorpusReader
from nltk.tokenize import LineTokenizer
#from nltk.tokenize import WordPunctTokenizer
from collections import defaultdict

# Create reader and generate corpus from all txt files in dir.
filecorpus = 'Twitter/FINAL_RESULTS/tweetcorpus'
filereader = TaggedCorpusReader(filecorpus, r'.*\.csv', sent_tokenizer=LineTokenizer())
print "Reader accessible." 
print filereader.fileids()

#define hotwords
hotwords = ('cool','foo','bar')

tweetdict = []

for line in filereader.sents():
wordcounts = defaultdict(int)
    for word in line:
        if word in hotwords:
            wordcounts[word] += 1
    tweetdict.append(wordcounts)

Вывод:

print tweetdict

[defaultdict(<type 'dict'>, {}),
 defaultdict(<type 'int'>, {'foo': 2, 'bar': 1, 'cool': 2}),
 defaultdict(<type 'int'>, {'cool': 1})]

Ответы [ 3 ]

4 голосов
/ 08 апреля 2011
from collections import Counter

hotwords = ('tweet', 'twitter')

lines = "a b c tweet d e f\ng h i j k   twitter\n\na"

c = Counter(lines.split())

for hotword in hotwords:
    print hotword, c[hotword]

Этот скрипт работает для Python 2.7 +

1 голос
/ 08 апреля 2011

defaultdict ваш друг для такого рода вещей.

from collections import defaultdict
for line in myfile:
    # tokenize
    word_counts = defaultdict(int)
    for word in line:
        if word in hotwords:
            word_counts[word] += 1
    print '\n'.join('%s: %s' % (k, v) for k, v in word_counts.items())
0 голосов
/ 08 апреля 2011

Вам нужно токенизировать это? Вы можете использовать count() в каждой строке для каждого из ваших слов.

hotwords = {'tweet':[], 'twitter':[]}
for line in file_obj:
    for word in hotwords.keys():
        hotwords[word].append(line.count(word))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...