我正在尝试挑选{word:{docId:int}}形式的字典。我的代码如下:
def vocabProcess(documents):
word_splitter = re.compile(r"\w+", re.VERBOSE)
stemmer=PorterStemmer()#
stop_words = set(stopwords.words('english'))
wordDict = {}
for docId in documents:
processedDoc = [stemmer.stem(w.lower()) for w in
word_splitter.findall(reuters.raw(docId)) if not w in stop_words]
for w in processedDoc:
if w not in wordDict:
wordDict[w] = {docId : processedDoc.count(w)}
else:
wordDict[w][docId] = processedDoc.count(w)
with open("vocabListings.txt", "wb") as f:
_pickle.dump(wordDict, f)
if __name__ == "__main__":
documents = reuters.fileids()
with open("vocabListings.txt", "r") as f:
vocabulary = _pickle.load(f)
当我运行此代码时,我收到错误
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2399:
character maps to <undefined>
当没有路透社文档/ docids中有unicode时,为什么会破坏?我如何解决这个问题,以便我仍然可以使用_pickle模块?
答案 0 :(得分:2)
您需要使用二进制模式来编写和读取泡菜。你的问题是:
with open("vocabListings.txt", "r") as f:
vocabulary = _pickle.load(f)
在Python 3上,以文本模式阅读会使str
(文本类型)不是bytes
(pickle
使用的二进制类型)。并且它会尝试解码数据,就好像它是您的语言环境编码中的文本一样;原始二进制流在许多编码中不太可能有效,因此在pickle
甚至看到数据之前,您将遇到错误。
在Windows上的Python 2上,读取文本模式有时会起作用,除非二进制数据在数据中有\r\n
序列,在这种情况下数据将被破坏(它将替换为{{1数据\n
中看到的数据)。
无论哪种方式,使用模式pickle
来阅读(就像你使用"rb"
一样),你就可以了。