Игнорирование повторяющихся слов в словаре Python - PullRequest
0 голосов
/ 29 марта 2011

У меня есть скрипт Python, который принимает файлы '.html', удаляет стоп-слова и возвращает все остальные слова в словаре 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()

1 Ответ

6 голосов
/ 29 марта 2011

Используйте 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
...