Open lucemia opened 2 years ago
要做dataset的話,需要定義好
我才能去做dataset~
要做dataset的話,需要定義好
- 我們的content需要納入的資訊
- 我們的content不要加入的資訊
我才能去做dataset~
目前看起來就照原本的 dataset 一樣的邏輯建立 dataset 就好了
你是問這個嗎?
原本dataset不會將圖片的連結納入content中,但是我們的parser會將圖片連結爬進content裡,會造成扣分。 現在我要建造新的dataset,那這個dataset我是要依照原本dataset的邏輯建造,要evaluate的時候再過濾掉圖片連結, 還是要直接將圖片連結納入content中去建造新的Dataset,這樣就可以直接evaluate
因為其他 parser 不支援這些額外資訊,因此會沒辦法正確評價其他 parser
我們最終需要的 Parser 需要 正文+ 圖片連結 + extra 資訊,但這些資訊需要能正確區隔開來才有用, 所以可以先評正文的分數,然後來挑選我們應該由哪個 Parser 為基礎來加入這些 extra info
原本dataset是用AutoExtract and Diffbot去爬下來的,但是這兩個沒有開源。 因此,我會先用看看評分不錯的newspaper3k去做做看。
原本dataset是用AutoExtract and Diffbot去爬下來的,但是這兩個沒有開源。 因此,我會先用看看評分不錯的newspaper3k去做做看。
記得要人力 review, 需要人力 review 時我會找其他 interns 一起做
好!我先試試看在評估一下時間
已標註完成。
Total: 309篇
Edit: 之後可能會減少,因為其他parser如果產生error就不能爬必須刪掉該testcase
準備要測試的parser(選擇與我們gparser評分差不多或是好的parser):
目前測試 gparser 的結果,是 MachineParser + 手工寫的 Parser 的結果 要測試 MachineParser 的結果
新增了一個 POST /parse-article
方式,可以 傳 raw_content (html) 上來
比對了一下兩邊的結果272/292完全一模一樣。
有不一樣的20筆,查看了其中8筆,不一樣的地方都很細微且幾乎都是內容以外的文字產生差異ex.爬到不同的更多內容的文章標題、Total viewer的數量、\n數量差異。 在計算評分時幾乎不會被影響到,因此評分相近。
會再去檢查一下source code看一下問題。
比對了一下兩邊的結果272/292完全一模一樣。
有不一樣的20筆,查看了其中8筆,不一樣的地方都很細微且幾乎都是內容以外的文字產生差異ex.爬到不同的更多內容的文章標題、Total viewer的數量、\n數量差異。 在計算評分時幾乎不會被影響到,因此評分相近。
會再去檢查一下source code看一下問題。
那應該是指定 name 沒有發生作用的緣故
https://gparsed-admin.gliaoffice.com/parsed/api/parse?name=MachineParserV2&url= 想確定一下,name=MachineParserV2是加在上面那個位置嗎?
https://gparsed-admin.gliaoffice.com/parsed/api/parse?name=MachineParserV2&url= 想確定一下,name=MachineParserV2是加在上面那個位置嗎?
用這個試試看 https://genv-parsed-al23s7k26q-de.a.run.app/docs#/default/parse_article_debug_parse_article_post
之前做dataset的時候是早上建好dataset,下午的時候才將html存下來,可能在這個期間有18間媒體有更新script導致現在用url或存下來的html爬蟲都爬不了,先不比較這18筆
正在檢查兩邊爬下來的結果比較大的差異
這次評價用html去爬蟲,只要不能爬的html都註記成空字串。
第一部分分數:使用原本的評分方式(比較是在比對有爬到結果的內容與ground truth)。
第二部分分數:在檢查他的precision和recall算法時,發現precision會忽略掉tp + fp == 0的值(空字串和ground truth比較的時候,fp + tp == 0),recall也會忽略掉tp + fn == 0值考慮進來(爬出來的字串與ground truth完全不一樣),因此第一部分算法不會考慮到空字串的扣分和與gt完全不一樣的情況。故第二部分的分數考慮空字串的扣分後,可以看到像goose3(爬出來有很多空字串),precision分數降低許多。
第三部分分數:除了考慮空字串的扣分,在recall的部分也將tp + fn == 0值考慮進來(爬出來的字串根ground truth完全不一樣)。
主要是透過定義不同的XPATH(ex BODY_XPATH, COMMENT_XPATH, DISCARD_XPATH, …..),在html tree中過濾掉不需要的nodes和找到想要的content。
在html tree中,先清理,在找到最有可能是content的candidates,去做評分再提取出article
也是透過html tree 去進行清理,在找content
(上述三個都沒有用到AI)
麻煩初步評估如何擴充:
Trafilatura利用定義許多x-path語法去抓取需要或是排除掉不需要的內容。因此要適應新網頁,需要手動的去調整原本設定的條件需要增加或減少。
Trafilatura本身可以抓取圖片、帶連結的文字和留言 但是圖片的抓取效果目前試了4個網頁,有出現漏抓或是沒有抓到任何一張的情況。 要抓到更多內容的話,需要自己列出目標的x-path語法,調整code。
另外,因為他在前處理的時候就將html tag轉換成xml standard,所以在output xml格式的時候 tag 不會是html 的tag。
剛剛發現trafilatura有paper,有看到一個2018年的machine learning parser叫web2text 之後可以試試看效果
大致上的演算法 load_html → tree_cleaning(remove unwanted and empty element) 分成kill tag(該tag的sub tree 全部移除)和remove tag(移除該tag而已) → convert tag → extract comment or exclude comment → extract content (cleaned_tree → use BODY_XPATH to find potential body → prune unwanted node by DISCARD_XPATH → remove elements by link density → check if meet minimum length → transfer the result tree into text → if result text < minimum length, then go back to cleaned tree and consider previous discard nodes)
link density 大致上的演算法
link_density_test
input : element tree
output: Boolean(True→ high density, need to delete. False→low density, may be content), my list(the word in )
def link_density_test(element):
links_xpath = element.xpath('.//ref') # find links
if links_xpath:
elemtext = element's context
elemlen = length of trim(elemtext) # trim: remove unneccessary space within a text
if element.tag == 'p':
limitlen, threshold = 25, 0.8 # limitlen:文字少於這個數量就歸類non-content # threshold: link文字佔比超過這一個比率就歸類為non-content
else:
if element.getnext() is None:
limitlen, threshold = 200, 0.66
else:
limitlen, threshold = 100, 0.66
if elemlen < limitlen:
linklen = the total length of word in links_xpath
elemnum = how many links
shortelems = the number of the word with length < 10 in links_xpath
mylist = list of the word in links_xpath
if elemnum == 0:
return True, mylist
if linklen >= threshold*elemlen or shortelems/elemnum >= threshold:
return True, mylist
return False, mylist
Trafilatura performs stable
Problem
Solution