在Python字典中忽略重复的词
我有一个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'"', 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
使用一个集合。只需将你找到的每个单词添加到集合中;它会自动忽略重复的单词。
假设你有一个迭代器,可以逐个返回文件中的每个单词(这适用于纯文本;处理HTML会复杂一些):
def words(filename):
with open(filename) as wordfile:
for line in wordfile:
for word in line.split():
yield word
然后将它们放入一个集合
中是很简单的:
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