2011-03-29 9 views
0

У меня есть скрипт Python, который принимает файлы .html, удаляет стоп-слова и возвращает все остальные слова в словаре python. Но если одно и то же слово встречается в нескольких файлах, я хочу, чтобы он возвращался только один раз. т. е. содержать нон-стоп слова, каждый раз один раз.Игнорирование повторяющихся слов в словаре python

def run(): 
filelist = os.listdir(path) 
regex = re.compile(r'.*<div class="body">(.*?)</div>.*', re.DOTALL | re.IGNORECASE) 
reg1 = re.compile(r'<\/?[ap][^>]*>', re.DOTALL | re.IGNORECASE) 
quotereg = re.compile(r'&quot;', re.DOTALL | re.IGNORECASE) 
puncreg = re.compile(r'[^\w]', re.DOTALL | re.IGNORECASE) 
f = open(stopwordfile, 'r') 
stopwords = f.read().lower().split() 
filewords = {} 

htmlfiles = [] 
for file in filelist: 
    if file[-5:] == '.html': 
     htmlfiles.append(file) 
     totalfreq = {} 


for file in htmlfiles: 
    f = open(path + file, 'r') 
    words = f.read().lower() 
    words = regex.findall(words)[0] 
    words = quotereg.sub(' ', words) 
    words = reg1.sub(' ', words) 
    words = puncreg.sub(' ', words) 
    words = words.strip().split() 

    for w in stopwords: 
     while w in words: 
      words.remove(w) 


    freq = {} 
    for w in words: 
      words=words 
    print words 

if __name__ == '__main__': 
run() 

ответ

6

Использовать set. Просто добавьте каждое слово, которое вы найдете в набор; он игнорирует дубликаты.

Если у вас есть итератор, который возвращает каждое слово в файле (это для обычного текста, HTML будет гораздо сложнее):

def words(filename): 
    with open(filename) as wordfile: 
     for line in wordfile: 
      for word in line.split(): 
       yield word 

Затем получить их в set прост:

wordlist = set(words("words.txt")) 

Если у вас есть несколько файлов, просто сделать так:

wordlist = set() 
wordfiles = ["words1.txt", "words2.txt", "words3.txt"] 

for wordfile in wordfiles: 
    wordlist |= set(words(wordfile)) 

Вы также можете использовать набор для ваших остановочных слов. Затем вы можете просто вычесть их из списка слов после факта, который, вероятно, будет быстрее, чем проверка того, чтобы каждое слово было слово остановки перед добавлением.

stopwords = set(["a", "an", "the"]) 
wordlist -= stopwords 
Смежные вопросы