PeterWolf-tw / NTNU_TextProcessing_2020

9 stars 27 forks source link

week10 作業提問 #20

Closed tzminch closed 3 years ago

tzminch commented 3 years ago

老師好,想請問如何將得出的結果新增到foxnews.json裡 我們目前找到的方法是用.setdefault() 但出現error: builtins.UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 226: invalid start byte

以下為使用之程式碼:

!/usr/bin/env python3

-- coding:utf-8 --

import json import nltk

讀取 json 的程式

def jsonTextReader(jsonFilePath): with open (jsonFilePath, "r", encoding = "utf8") as f: jsonContent = json.load(f) return jsonContent

if name== "main": jsonFilePath = "./foxnews.json" foxnewsjson = jsonTextReader(jsonFilePath) foxnewsSTR = jsonTextReader(jsonFilePath)["content"]

foxsentenceLIST = nltk.sent_tokenize(foxnewsSTR)
foxwordLIST = []
for s in foxsentenceLIST:
    foxwordLIST.extend(nltk.word_tokenize(s))
#print(foxwordLIST)

foxPOS = nltk.pos_tag(foxwordLIST) #LIST
#print(foxPOS)

foxNER = nltk.ne_chunk(foxPOS)
#print(foxNER)
#print(type(foxNER))

foxnewsjson.setdefault('foxsentenceLIST', foxsentenceLIST)
foxnewsjson.setdefault('foxwordLIST', foxwordLIST)
foxnewsjson.setdefault('foxPOS', foxPOS)
foxnewsjson.setdefault('foxNER', foxNER)

print(foxnewsjson)
Droidtown commented 3 years ago

哦哦,你想得太複雜了。 你取得的 jsonContent 就已經是一個 dictionary 的物件了,只要把你要新增的東西加進去這個字典裡,最後再把整個字典寫成 foxnews.json 就行了。

例如: jsonContent["foxwordLIST"] = foxwords

這樣就把 foxwords 這個 LIST 加到 jsonContent 這個字典裡,並且給它一個 key,名為 "foxwordLIST" 了。 接下來就是把 jsonContent 利用 json 模組的 dump 寫到檔案裡囉。

Best, Peter. w

tzminch commented 3 years ago

老師好,我目前還是遇到 builtins.UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 226: invalid start byte 的問題。想請問原因是什麼呢?

PeterWolf-tw commented 3 years ago

你方不方便直接把程式 push 上去,然後我再去 pull 下來試試?

tzminch commented 3 years ago

你方不方便直接把程式 push 上去,然後我再去 pull 下來試試?

我目前暫時可以執行,但是在把讀取json的函式中encoding = "utf8"刪除後才可以。(具體原因我也不清楚,因為我來回試過很多次,包含有encoding = "utf8",沒有encoding = "utf8"的也有,都出現UnicodeDecodeError:。最後我不知道為什麼就可以執行了)

現在push上來的檔案在此: https://github.com/PeterWolf-tw/NTNU_TextProcessing_2020/blob/master/week10/squad/week10_squad.py

再麻煩老師幫忙看看,謝謝。

PeterWolf-tw commented 3 years ago

如果你程式碼沒有改,但卻「有時候可以執行,有時候會出現 encoding 的錯誤」那麼問題就不在你的程式裡,而是那個讀入的檔案本身的編碼上了。

記得課堂中有提到,所有的系統都用 Unicode 了,只有 Windows 轉了一半。這個「只轉一半」就讓它同時有了 utf-8、GB (簡體中文) 以及 Big-5 (繁體中文) 三種編碼。如果開檔案的時候選錯了編碼,就會遇到前述的錯誤。

讓你的程式能適用三種編碼的方法,是利用 try...except... 的方式處理。

try: 用 utf-8 來開檔案 except UnicodeDecodeError: try: 用 Big-5 (encoding="cp950") 來開檔案 except: 用 GB (encoding="gb") 來開檔案

把開檔案的段落改成這樣,就能讓程式一個一個試下去了。

這也是這門課和其它 NLP 或 Text Processing 課程最大的不同。其它的類似課程通常都處理英文,而我在設計課程時希望能把同學們最常遇到的「中文文本」的處理當做主軸。而中文文本就是有這些編碼、全型半型的事情要處理。

tzminch commented 3 years ago

好的,謝謝老師。