Я новичок в python и наивно написал сценарий python для следующей задачи:
Я хочу создать набор слов, представляющих несколько объектов. Каждый объект - это, по сути, пара, и должен быть составлен набор слов для синопсиса. Таким образом, объект конвертируется в окончательные документы.
Вот сценарий:
import re
import math
import itertools
from nltk.corpus import stopwords
from nltk import PorterStemmer
from collections import defaultdict
from collections import Counter
from itertools import dropwhile
import sys, getopt
inp = "inp_6000.txt" #input file name
out = "bowfilter10" #output file name
with open(inp,'r') as plot_data:
main_dict = Counter()
file1, file2 = itertools.tee(plot_data, 2)
line_one = itertools.islice(file1, 0, None, 4)
line_two = itertools.islice(file2, 2, None, 4)
dictionary = defaultdict(Counter)
doc_count = defaultdict(Counter)
for movie_name, movie_plot in itertools.izip(line_one, line_two):
movie_plot = movie_plot.lower()
words = re.findall(r'\w+', movie_plot, flags = re.UNICODE | re.LOCALE) #split words
elemStopW = filter(lambda x: x not in stopwords.words('english'), words) #remove stop words, python nltk
for word in elemStopW:
word = PorterStemmer().stem_word(word) #use python stemmer class to do stemming
#increment the word count of the movie in the particular movie synopsis
dictionary[movie_name][word] += 1
#increment the count of a partiular word in main dictionary which stores frequency of all documents.
main_dict[word] += 1
#This is done to calculate term frequency inverse document frequency. Takes note of the first occurance of the word in the synopsis and neglect all other.
if doc_count[word]['this_mov']==0:
doc_count[word].update(count=1, this_mov=1);
for word in doc_count:
doc_count[word].update(this_mov=-1)
#print "---------main_dict---------"
#print main_dict
#Remove all the words with frequency less than 5 in whole set of movies
for key, count in dropwhile(lambda key_count: key_count[1] >= 5, main_dict.most_common()):
del main_dict[key]
#print main_dict
.#Write to file
bow_vec = open(out, 'w');
#calculate the the bog vector and write it
m = len(dictionary)
for movie_name in dictionary.keys():
#print movie_name
vector = []
for word in list(main_dict):
#print word, dictionary[movie_name][word]
x = dictionary[movie_name][word] * math.log(m/doc_count[word]['count'], 2)
vector.append(x)
#write to file
bow_vec.write("%s" % movie_name)
for item in vector:
bow_vec.write("%s," % item)
bow_vec.write("\n")
Формат файла данных и дополнительная информация о данных: Файл данных имеет следующий формат:
Название фильма. Пустая строка. Синопсис фильма (можно предположить, что размер составляет около 150 слов) Пустая строка.
Примечание: <*>
предназначены для представления.
Размер входного файла:
Размер файла около 200 МБ.
На данный момент этот сценарий занимает около 10–12 часов на процессоре Intel с тактовой частотой 3 ГГц.
Примечание: я ищу улучшения в серийном коде. Я знаю, что распараллеливание улучшило бы это, но я хочу изучить это позже. Я хочу воспользоваться этой возможностью, чтобы сделать этот серийный код более эффективным.
Любая помощь приветствуется.