[問題] 字串的關鍵字提取

看板Python作者 (金牌台灣啤酒)時間4年前 (2020/03/05 09:41), 4年前編輯推噓5(5032)
留言37則, 7人參與, 4年前最新討論串1/1
嗨大家好,我有一個表格像是這樣 http://i.imgur.com/ld7tHmC.jpg
最後一欄Note是這個球員的受傷資訊,可以看到有 right hamstring injury、concussion 而我現在只需要部位不需要其他描述,例如 sore lower back我只需要back,right knee injury只需要knee。 我第一個想法是把所有部位集中成一個list,然後split字串做mapping,但這個做法有點費時。 第二個想法是搜集形容詞並抓形容詞後的單字,但資料的字串順序又不是那麼整齊。 想問各位有什麼好的提取法嗎? 附上網址 https://reurl.cc/xZxR7E -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.137.30.149 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1583372474.A.EAB.html ※ 編輯: moodoa3583 (223.137.30.149 臺灣), 03/05/2020 09:45:21 ※ 編輯: moodoa3583 (223.137.30.149 臺灣), 03/05/2020 09:46:25

03/05 09:49, 4年前 , 1F
抓right left後的第一個字,其他另外設計?
03/05 09:49, 1F
這有點像我的想法2,但因為我有約莫2萬筆資料,排序都不完全一樣,而除了right,left之外也有很多不同的形容詞,所以這個想法有點難度

03/05 09:56, 4年前 , 2F
我最近才解決一個很類似的問題(但複雜很多),我只能說以
03/05 09:56, 2F

03/05 09:57, 4年前 , 3F
你這個問題的規模,第一種想法有可能反而會是實作最快的。
03/05 09:57, 3F
※ 編輯: moodoa3583 (223.137.30.149 臺灣), 03/05/2020 09:58:12

03/05 09:59, 4年前 , 4F
第二個想法只能做為萬一出現不在列表中的部位時,嘗試自動
03/05 09:59, 4F

03/05 09:59, 4年前 , 5F
抓取部位的候補想法
03/05 09:59, 5F

03/05 10:00, 4年前 , 6F
因為你的範圍限定在球員,常見傷病種類會有一定的範圍,第
03/05 10:00, 6F

03/05 10:01, 4年前 , 7F
一種想法未必如想像中耗時。而且可以在有列表未出現的案例
03/05 10:01, 7F

03/05 10:01, 4年前 , 8F
時再直接針對該案例補充關鍵字即可,不需要要求第一次建立
03/05 10:01, 8F

03/05 10:01, 4年前 , 9F
List就是完整的
03/05 10:01, 9F

03/05 10:02, 4年前 , 10F
或者也可反過來,你先進行第二種想法做為人力添加關鍵字的
03/05 10:02, 10F

03/05 10:03, 4年前 , 11F
輔助,這樣也可以節省一些時間
03/05 10:03, 11F

03/05 10:04, 4年前 , 12F
維持第一個想法+1 如果該欄有未包含部位就報錯 直到沒
03/05 10:04, 12F

03/05 10:04, 4年前 , 13F
有報錯為止
03/05 10:04, 13F

03/05 10:04, 4年前 , 14F
assert all((body_part in note_text) for body_part i
03/05 10:04, 14F

03/05 10:04, 4年前 , 15F
n body_part_list),'需要更新身體部位的欄位:'+note_te
03/05 10:04, 15F

03/05 10:04, 4年前 , 16F
xt
03/05 10:04, 16F

03/05 10:05, 4年前 , 17F
我自己解的問題是用多重機制共同驗證來幫每個關鍵字算積分
03/05 10:05, 17F

03/05 10:06, 4年前 , 18F
做排名然後優先從高分關鍵字選下來,但那是因為我的關鍵字
03/05 10:06, 18F

03/05 10:07, 4年前 , 19F
種類甚至無法限定在名詞,還可能是一個句子。你這work單純
03/05 10:07, 19F

03/05 10:07, 4年前 , 20F
許多,我想是不用這麼費工。
03/05 10:07, 20F
了解,感謝以上大大,那我先以想法1來做,有什麼更好的解法再丟上來 ※ 編輯: moodoa3583 (223.137.30.149 臺灣), 03/05/2020 12:31:57 ※ 編輯: moodoa3583 (223.137.30.149 臺灣), 03/05/2020 12:32:16

03/05 14:51, 4年前 , 21F
為什麼不用regex?
03/05 14:51, 21F

03/05 14:52, 4年前 , 22F
把身體部位寫成pattern比對即可
03/05 14:52, 22F
這也是接近想法1,但比較不好處理的是我不知道全部的身體部位,而且裡面也有提到像是illness, concussion 等症狀,這也是我想留下來的 ※ 編輯: moodoa3583 (223.137.30.149 臺灣), 03/05/2020 15:31:13

03/05 17:14, 4年前 , 23F
其實是不太一樣。還有另一個選擇PyParsing
03/05 17:14, 23F

03/05 17:39, 4年前 , 24F

03/05 17:39, 4年前 , 25F
docs/pycon06-IntroToPyparsing-notes.pdf
03/05 17:39, 25F

03/05 18:15, 4年前 , 26F
我是總覺得這個問題規模應該不至於要搞到分析語句詞性XD
03/05 18:15, 26F

03/05 18:16, 4年前 , 27F
NBA球員範圍而已,光是總量可能都未必多到哪裡去,部位名
03/05 18:16, 27F

03/05 18:16, 4年前 , 28F
稱也應該重複使用的字詞很多,這應該是人力可及的範圍XD
03/05 18:16, 28F

03/05 18:17, 4年前 , 29F
而且先基本做看看,發現真的不行或將來要擴展到資料很多的
03/05 18:17, 29F

03/05 18:17, 4年前 , 30F
範圍,再補上關鍵字自動萃取機能來輔助也還來得及
03/05 18:17, 30F

03/05 18:21, 4年前 , 31F
做詞性分析,把名詞提取出來
03/05 18:21, 31F

03/05 18:25, 4年前 , 32F
剛剛用這個試了一下 成功率很高
03/05 18:25, 32F

03/05 18:25, 4年前 , 33F
感謝各位的建議,後來是把notes裡的字用split切開後丟進一個list,去掉長度為1的廢字後做Counter,然後再把left,right等出現很多次的形容詞去除,慢慢留下出想要的字 ※ 編輯: moodoa3583 (223.137.30.149 臺灣), 03/05/2020 22:44:05

03/05 22:49, 4年前 , 34F
噢對,如果各位有興趣知道的話,2000到2020年最多球員
03/05 22:49, 34F

03/05 22:49, 4年前 , 35F
受傷的部位是膝蓋,然後依次是腳踝,背部,腳掌,腿後
03/05 22:49, 35F

03/05 22:49, 4年前 , 36F
肌(hamstring )
03/05 22:49, 36F

03/07 10:02, 4年前 , 37F
只能用關鍵字抓吧
03/07 10:02, 37F
文章代碼(AID): #1UO5Ywwh (Python)