這是我的df

我在下面創建了一個函式來根據評論的詞性標簽獲取三元組。
def get_trigram(pos_1, pos_2, pos_3):
all_trigram = []
for j in range(len(df)):
trigram = []
for i in range(len(df['pos'][j]['pos'])):
if [value for value in df['pos'][j]['pos']][i-2] == pos_1 and [value for value in df['pos'][j]['pos']][i-1] == pos_2 and [value for value in df['pos'][j]['pos']][i] == pos_3:
trigram.append([value for value in df['pos'][j]['word']][i-2] " " [value for value in df['pos'][j]['word']][i-1] " " [value for value in df['pos'][j]['word']][i])
all_trigram.append(trigram)
return all_trigram
運行函式時沒有錯誤,但是當我呼叫我的函式時
tri_adv_adj_noun = get_trigram('ADV', 'ADJ', 'NOUN')
它給出了一個錯誤:IndexError: list index out of range
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-149-12b4d4ffff3d> in <module>()
----> 1 tri_adv_adj_noun = get_trigram('ADV', 'ADJ', 'NOUN')
2 tri_noun_adv_adj = get_trigram('NOUN', 'ADV', 'ADJ')
3
4 trigram = tri_adv_adj_noun tri_noun_adv_adj
<ipython-input-148-60ed39e749d0> in get_trigram(pos_1, pos_2, pos_3)
8 for i in range(len(df_long['pos'][j]['pos'])):
9
---> 10 if [value for value in df_long['pos'][j]['pos']][i-2] == pos_1 and [value for value in df_long['pos'][j]['pos']][i-1] == pos_2 and [value for value in df_long['pos'][j]['pos']][i] == pos_3:
11 trigram.append([value for value in df_long['pos'][j]['word']][i-2] " " [value for value in df_long['pos'][j]['word']][i-1] " " [value for value in df_long['pos'][j]['word']][i])
12
IndexError: list index out of range
供參考,
df['pos'][0] 回傳包含 2 個串列的字典



uj5u.com熱心網友回復:
我假設您的問題在于
[value for value in df_long['pos'][j]['pos']][i-2]
首先,可能是您的“pos”列中的某些“pos”字典資料丟失,在這種情況下,您應該設定一個條件,首先驗證字典是否填充了資料。否則,當訪問元素少于您正在搜索的索引值的串列時,您將收到該錯誤(例如,i-2 將從串列末尾回傳 2 個位置,并且'找不到足夠的元素回傳,它會拋出“串列索引超出范圍”錯誤)例如:
if len(df['pos'][j]['pos']) >= 3:
for i in range(len(df['pos'][j]['pos']):
...
其次,像這樣撰寫代碼是多余的,因為您正在使用串列中的資料制作串列。你可以寫:
if df_long['pos'][j]['pos'][i-2] == pos_1 and df_long['pos'][j]['pos'][i-1] == pos_2 etc..
或者通過添加一個具有描述性名稱的變數來進一步增強它的可見性:
for j in range(len(df)):
trigram = []
pos_list = df['pos'][j]['pos']
if len(post_list) >= 3:
for i in range(len(pos_list)):
if pos_list[i-2] == pos_1 and pos_list[i-1] == pos_2 ...
希望這可以幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/482805.html
