坑1 沒有paddlehub裏面的模型文件
原因:
沒有下載paddlehub 沒有import paddlehub 沒有使用hub命令下載senta_bilstm模型
模型下載命令:!hub install senta_bilstml==1.0.0
可以引伸出來 使用paddlehub,所有找不到模型額問題,都是paddle沒有加載進來
坑2 matplotlib顯示中文的問題
原因
1.沒有安裝中文字體
2.安裝了中文字體,但是沒有複製到matplotlib下面
3.設置matplotlib.rcParams
4.for mac:安裝好以後需要使用rm -r ~/.matplotlib 刪除~/.matplotlib文件
解決方法
#下載中文字體
wget https://mydueros.cdn.bcebos.com/font/simhei.ttf
#在操作系統中創建字體目錄fonts(可能已經有
mkdir .fonts
# 複製字體文件到該路徑
cp simhei.ttf .fonts/
#複製字體到當前使用的conda環境中的matplotlib下的指定路徑
cp simhei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
# Linux系統默認字體文件路徑
ls /usr/share/fonts/
# 查看系統可用的ttf格式中文字體
fc-list :lang=zh | grep ".ttf"
# 設置顯示中文
matplotlib.rcParams['font.family'] = ['SimHei']
# 解決負號'-'顯示爲方塊的問題
matplotlib.rcParams['axes.unicode_minus'] = False
最終效果:
坑3這是一個系列性的問題(day4問題
可能的報錯
這一系列的問題都出現在使用paddlehub進行Finetune的時候 也就是在運行run_states = task.finetune_and_eval()這行代碼的時候。
其實可以很容易知道,我們不能對模型做什麼改動,只有在運行這一行代碼的時候報錯了,那麼我們唯一和模型進行交互的是什麼呢?是我們的數據集,所有肯定是我們的額數據集出現了問題呀。
歸根到底,出現問題還是沒有理解paddlehua的自定義數據集的規定。
from paddlehub.dataset.base_cv_dataset import BaseCVDataset
class DemoDataset(BaseCVDataset):
def __init__(self):
# 數據集存放位置
self.dataset_dir = "dataset"
super(DemoDataset, self).__init__(
base_path=self.dataset_dir,
train_list_file="train_list.txt",
validate_list_file="validate_list.txt",
test_list_file="test_list.txt",
label_list_file="label_list.txt", )
dataset = DemoDataset()
從這個DemoDataset可以看出,dataset_dir設定了所有的路徑的root節點,相當於下面super裏面的所有路徑前面都要加入dataset/這個前綴。詳細的要求可以查看適配自定義數據
然後就是train_list.txt、validate_list.txt和test_list.txt裏面的內容了。
以上圖(train_list.txt)裏面的內容爲例.分爲兩列:
第一列是訓練數據的路徑,這裏也是最容易出錯的,這裏的路徑默認前面是有了一個dataset的,也就是我們在前面代碼裏面設置的self.dataset_dir = “dataset”,很多問題都是出現在這裏的,因爲這裏寫錯了,那麼模型就加載不到圖片,肯定會報錯呀。
然後就是第二列的數據,中間以空格分割,第二列的數據與label_list.txt裏面的內容形成索引。
以上是label_list.txt裏面的內容,paddle在查詢的時候,訓練和測試文件的時候,會自動根據索引去label_list.txt中匹配label。
坑4在python中使用paddlehub的情感分析
這個的坑在於,傳入的數據必須是個字典,而且字典的key要爲text,value必須要是個list。
senta = hub.Module(name='senta_bilstm', version='1.0.0')
input_dict = {'text':['你好呀!','ennenene']}
res = senta.sentiment_classify(data=input_dict)
坑5 大作業爬蟲
本次大作業第一步就是爬取評論的數據,這個爬蟲相對來說不要太容易了,唯一的槽點就是調用的接口找起來有點麻煩,在這裏給出,結構的url如下,對於參數來說,只要注意content_id和last_id就行了,content_id代表的是那一步電影/電視(in iqiyi)。然後last_id的話主要是達到一個翻頁的作業,只需要把本次查詢到的最後一個評論的用戶的id賦值給last_id就可以實現查詢下一頁的評論了。
接口鏈接和參數如下
意思的話從參數名上面大部分就能看明白了
坑6 json.loads 和 json.dump
這兩個函數會由於基本功的問題,容易搞混淆或者記不起怎麼用。
當我們通過接口爬取到數據後,返回的通常都是json類型的字符串數據。這個時候我們就需要上面的兩個函數來幫忙了,那麼到底這兩個函數怎麼用呢。
通俗的講:
json.loads(str(data):將一個JSON編碼的字符串轉換回一個Python數據結構(通常爲字典
json.dump(json_data): 將一個Python數據結構轉換爲JSON字符串,通常在寫文件的時候使用。
所有本次大作業,先拿到的就是json類型的字符串,我們要拿到裏面的comments的話就要先把它轉換爲dict類型的數據,然後再訪問:
lastId = ''
response = getComment(lastId) #getComment發送請求得到json類型的字符串
response = json.loads(response) #使用json.loads解析
comment_list = response['data']['comments'] #得到一次返回的所有comments的list
lastId = comment_list[-1]['id'] #得到lastID 然後再次使用getComment(lastId)
while len(comment_list) <1000:
getComment(lastId)
……
……
#當要持久化爬取到的json數據的時候 就要使用json.dump()
with open('day5.json', 'w', encoding='UTF-8') as f:
json.dump(comment_list, f, ensure_ascii=False)
2020.4.27 00:12 未完待續