成人av在线资源一区,亚洲av日韩av一区,欧美丰满熟妇乱XXXXX图片,狠狠做五月深爱婷婷伊人,桔子av一区二区三区,四虎国产精品永久在线网址,国产尤物精品人妻在线,中文字幕av一区二区三区欲色
    您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
    此為臨時鏈接,僅用于文章預覽,將在時失效
    人工智能開發者 正文
    發私信給skura
    發送

    0

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    本文作者: skura 2019-04-23 13:20
    導語:詳細指南

    雷鋒網 AI 科技評論按,數據是所有機器學習問題的核心。如果不能訪問相關數據,那么現在使用機器學習所取得的所有進展都是不可能的。盡管如此,如今大多數機器學習愛好者專注于獲取方法論知識(這是一個很好的開始,但不是一直如此)。

    當方法論達到一定程度時,僅解決數據集可用的問題就限制了其潛力。

    幸運的是,我們生活在一個網絡上有大量數據可用的時代,我們所需要的只是識別和提取有意義的數據集的技能。對此,亞馬遜工程師 Rishabh Misra 分享了他關于如何識別、抓取和構建一個高質量的機器學習數據集的心得,雷鋒網 AI 科技評論編譯整理如下。

    本文的重點是通過真實的案例和代碼片段解釋如何構建高質量的數據集。

    本文將參考作者收集的三個高質量數據集,即服裝尺寸推薦數據集、新聞類別數據集和諷刺檢測數據集來解釋不同的點。下面先簡要地解釋每個數據集是關于什么的。

    • 服裝尺寸推薦數據集

    服裝尺寸推薦和合身度預測對于改善顧客的購物體驗和降低產品返工率至關重要。從 ModCloth 收集的數據集包含客戶對其購買的服裝是否合適的反饋,以及諸如評級、評論、類別信息、客戶度量等其他方面的信息。這個數據集在識別決定服裝產品是否適合客戶的關鍵特征方面很有用。

    • 新聞類別數據集

    該數據集包含從 HuffPost 獲得的 2012 至 2018 年約 20 萬條新聞的標題。它包含諸如新聞類別、新聞標題、新聞故事的簡短描述、出版日期等詳細信息。數據集可以用于多種用途,如識別未跟蹤的新聞文章的標簽、識別不同新聞類別中使用的語言類型等。

    • 諷刺檢測數據集

    過去關于諷刺檢測的研究大多是利用基于 hashtag 的監督收集的 twitter 數據集,但這些數據集在標簽和語言方面存在噪音。為了克服這些限制,這個數據集是從兩個新聞網站收集的:TheOnion 和 HuffPost。TheOnion 制作了當前事件的諷刺版本,而 HuffPost 則報道了真實和非諷刺的新聞。

    一個有趣的事實是:這些數據集在 Kaggle 上共有超過 250 個贊、50k+次瀏覽、6000+次下載和 50+個提交者。

    步驟1:搜索數據

    這個階段需要耐心,因為你可能需要廣泛地進行網絡搜索。但你不用擔心。在這里,我將根據我的經驗提供一些指導,使您的搜索更加系統和高效。

    如果您希望收集和構建一個高質量的數據集,那么您可能處于以下兩種情況之一:

    您正在尋找一個數據集去解決特定的問題 [已知問題]。

    您正在尋找可用于解決有趣問題的數據集 [未知問題]。

    根據您所處的情況,以下指南將很有幫助。

    已知問題

    收集服裝合身度和諷刺檢測數據集,以解決特定的問題。

    以下步驟可能有助于在這種情況下搜索數據集:

    分解問題以識別解決問題所必需的數據信號:這是最重要的一步。在尺寸推薦問題的情況中,如果我們想向客戶推薦服裝尺寸,那么最重要的數據信息將是用戶 ID、產品 ID、購買的尺寸以及客戶對本次購買尺寸是否合適的反饋。其他信息,如產品類別、客戶測量等,有了更好但也不是必須的。

    在網絡上搜索一個提供所有必要信息的來源:在這里,你的谷歌搜索技巧會派上用場。使用它可以瀏覽多個網站,并查看它們是否提供必要的數據信息。對于服裝尺寸匹配數據集,像 Zappos 這樣的網站似乎很有希望,但缺少基本的購買尺寸信息,而 ModCloth 確實提供了所有基本數據信息(盡管需要進行一些額外的調整,稍后將詳細介紹)。

    如果找不到單個數據源,請查看是否可以組合多個數據源的數據來構建數據集:諷刺檢測數據集是將多個源的數據組合起來以構建完整且質量良好的數據集的完美示例。因為我們知道問題(發現諷刺)和我們想要的數據類型(諷刺和非諷刺文本),所以我們不必堅持用一個數據源來提供所有信息。我將 TheOnion 確定為獲取諷刺文本的來源,而對于非諷刺文本,我選擇了一個真正的新聞報道網站 HuffPost。

    查看數據源是否包含足夠的歷史數據,以允許您構造足夠大的數據集:這也是在開始收集數據之前需要考慮的一個非常重要的點。如果一個網站沒有足夠的數據,例如,一個在線零售商沒有大量的產品可提供,或者如果一個新聞網站不包含對舊故事的存檔,那么即使你收集了這些數據,它也不會給你帶來多大好處。所以,尋找一個提供足夠數據的數據源來構造足夠大的數據集。

    如何改進數據集?你能把其他來源的數據結合起來使它更有趣嗎?檢查完上述所有點后,看看如何進一步改進數據集。思考一下,您是否可以通過不同的數據源組合有關某些屬性的更多信息,這些信息可能會幫助人們為他們的模型構建特性。

    未知問題

    在解釋這些類型情況的時候,新聞類別數據集是一個很好的選擇。不知道要找的是什么會使情況稍微復雜一點,但是,當您在瀏覽網頁時注意以下幾點可以幫助您識別下一個有趣的數據集:

    數據源是否包含任何值得估計/預測的數據信號?:分析網站時,請考慮網站是否提供了任何值得評估的有趣信息。它可以是一些直接的東西,或者與網站上的信息類型有關的東西。

    一個直截了當的例子是,我在 HuffPost 上注意到,每個故事都被進行了分類(如體育、政治等),而我認為預測分類將是一個有趣的問題。對于信息類型的案例,我將 HuffPost 的新聞標題視為諷刺檢測數據集中的非諷刺性句子(假設他們報道的是真實新聞),而將 TheOnion 的標題視為諷刺性句子。

    數據源是否包含足夠的元數據,這些元數據在預測結果時是否有用?一旦您選定了一個值得預測的數據信息,您就必須確保站點為您提供足夠的可用于預測該數據信息的相關信息,如果不是,您是否可以使用其他數據源將該信息帶到數據集中。例如,如果我們沒有關于商品的元數據,那么在電子商務平臺上預測產品價格的效果可能不會很好。為了使數據集成為一個好的數據集,需要足夠的相關信息。

    站點是否包含足夠的歷史數據,讓你可以構建足夠大的數據集?這與「已知問題」部分中的第 4 點相同。
    預測結果有什么重要的意義或應用嗎?高質量數據集的一個標志是,它還可以用于解決有趣的實際問題,或者能夠對某些現象提供有趣的見解。例如,基于新聞類別數據集構建的分類器可以幫助識別任何散文的寫作風格(無論是政治、幽默等),幫助標記未跟蹤的新聞文章,提供對不同類型新聞的寫作風格差異的洞察等等。

    交叉檢查以查看此類數據是否已經可用。如果是,數據集是否在現有數據集上添加了任何內容?這一步很重要,這樣你就知道你在貢獻一些獨特的東西,而不是一些已經存在的東西。從這一步開始,在谷歌上簡單搜索就足夠了。

    如何改進數據集?你能把其他來源的數據結合起來使它更有趣嗎?這與「已知問題」部分中的第 5 點相同。

    步驟 2:提取數據

    一旦縮小了數據源范圍,我們就可以開始提取數據了。

    在抓取數據之前,請仔細閱讀網站的條款,以確保您不會因為抓取和公開分發數據而違反法律規則。

    由于在不舉實際例子的情況下很難解釋這一節,因此我將以我在從 ModCloth 獲取數據時使用的腳本為例來闡述不同的觀點。

    了解網站的結構

    首先要做的是熟悉站點的結構。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    在 ModCloth 上,我們看到在網站頂部有各種服裝類別:連衣裙、上衣、下裝等等。如果我們單擊其中一個類別(如上圖中的頂部),就會看到產品以網格格式顯示。圖片中的頁面顯示 100 個產品,其余產品可通過滾動右上角附近的頁面滾動器訪問。

    接下來,我們單擊其中一個產品來觀察每個產品的頁面是什么樣子的。在頂部,我們有與項目相關的元數據,在底部,我們有產品評論。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    我們注意到每一頁最多包含 10 條評論。如果評論超過 10 條,我們會在右下角看到「NEXT」按鈕。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    當我們單擊「NEXT」按鈕時,將顯示接下來的 10 條評論。但是,您可能會注意到鏈接沒有更改,這意味著除了單擊「NEXT」按鈕之外,沒有其他方法可以訪問后續評論。我們還可以看到,在隨后的頁面中,還會出現「PREVIOUS」按鈕。稍后我們將知道為什么這些細節對于數據提取很重要。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    我們現在對網站的結構有了相當好的了解。重申一下,我們的目標是從每個類別中提取每個產品的評論。

    提取產品鏈接

    由于類別數量有限,因此不需要編寫腳本來提取鏈接,我們可以手動收集這些鏈接。在本節中,我們將重點從服裝類別之一:上衣中提取產品鏈接

    要了解數據提取的基礎知識,請瀏覽以下博客:如何使用 pytho 和 BeautifulSoup 提取網站數據
    我們還將利用瀏覽器自動化工具 Selenium 進行數據提取。

    要了解 Selenium 的工作原理,請瀏覽以下博客:使用 Selenium 提取網站數據

    那么,讓我們開始吧:

    到目前為止,我們知道在每個類別中,產品以每組 100 個的形式呈現,我們可以滾動頁面滾動器來訪問所有產品。首先,我們需要了解不同頁面的鏈接是如何變化的。通常情況下,以下圖片建議使用遵循一個模式的鏈接。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    頁面 1

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    頁面 2

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    頁面 3

    然后,對于每個頁面,我們需要提取到單個項目的頁面的鏈接。為此,請轉到其中一個項目,右鍵單擊該項目并轉到「inspect」選項。滾動滾動條以識別包含 item 鏈接的<a>元素并注意其 css 類。在下面的圖片中,我們看到在我們的例子中,類是虛鏈接。最有可能的是,所有其他產品鏈接也將使用相同的類進行樣式設計(只需驗證一次)。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    有了這些信息,我們可以編寫以下代碼來提取 Tops 類別中所有產品的鏈接:

    from selenium import webdriver   

    from bs4 import BeautifulSoup


    # download driver from http://chromedriver.chromium.org/downloads   

    path_to_chromedriver = './chromedriver2.exe'   

    browser = webdriver.Chrome(executable_path = path_to_chromedriver)   


    urls = []; counter = 0; tops_link = []   

    ## Since Tops category has 7 pages, link to each following a specific pattern,   

    ## we can create links to pages in following way.   

    for i in range(7):   

            urls.append('https://www.modcloth.com/shop/tops?sz=102&start='+str(counter))   

            counter += 102   


    ## Extracting links for products in each page   

    for url in urls:   

            ## open the url   

            browser.get(url)   


            ## purposeful wait time to allow website to get fully loaded   

            time.sleep(4)  


            ## get page content   

           content = browser.page_source   

            soup = BeautifulSoup(content, "lxml")   


            product_links = []   


            ## extract all the "a" elements with "thumb-link" class from the page   

            data_links = soup.find_all("a", {"class":"thumb-link"})   


            ## from each <a> element, extract the URL   

            for i in data_links:   

                    product_links.append(i['href'])   


            tops_link.extend(product_links)   


            ## purposeful wait time to avoid sending requests in quick succession   

            time.sleep(10)

    正如您所注意到的,腳本有等待時間,以確保我們不會向站點太頻繁地發送請求。通常,每秒一個請求是合適的,但是考慮到 ModCloth 是一個小站點(可能沒有亞馬遜那么大),我們可以將等待時間延長。在這方面你可以運用你的判斷力。

    提取評論

    既然我們已經為每個產品建立了一個鏈接,那么我們就可以更深入地了解每個產品的評論。首先,我們將檢查每個評論對應的 HTML。再次,右鍵單擊查看并單擊「inspect」。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    我們注意到每個評論都包含在<article>元素中。讓我們來探索一下<article>元素的構成。我們可以通過單擊元素旁邊的箭頭來實現這一點。當我們將鼠標懸停在<article>標記內的各個元素上時,相應的視圖將在網頁上突出顯示。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    例如,在上面的圖像中,具有名為「pr-rd-content-block pr-accordion pr-accordion-collapsed」的類的<section>元素折疊對應于尺寸反饋意見和與客戶測量相關的數據。請參閱下面的腳本以了解如何提取<article>里面所有相關內容的詳細信息。

    from selenium.common.exceptions import NoSuchElementException, WebDriverException

    import numpy as np   

    import random   


    ## helper function to consolidate two dictionaries    

    def merge_two_dicts(x, y):    

            z = x.copy()   # start with x's keys and values    

            z.update(y)    # modifies z with y's keys and values & returns None    

            return z    


    scraped_data = []    

    ## for each product in Tops category    

    for iterr in range(0,len(tops_link)):    

            init = 0    

            url = tops_link[iterr]    


            ## open the URL in browser    

            try:    

                    browser.get(url)    

                    time.sleep(4)    

            except WebDriverException: ## when extracted URL is invalid    

                    print('invalid url', iterr)    

                    continue    


            ## get the webpage content    

            content = browser.page_source    

            soup = BeautifulSoup(content, "lxml")    


            ## repeat until we run of review pages    

            while(True):    

                    ## get the webpage content    

                    content = browser.page_source    

                    soup = BeautifulSoup(content, "lxml")    


                    ## extract reviewer details   

                   reviewer_details = soup.find_all("div", {"class": "pr-rd-reviewer-details pr-rd-inner-side-cont                                                                  ent-block"})    


                  ## extract reviewers' name    

                    reviewers_name = []    

                    for reviewer in reviewer_details:    

                            ## In ModCloth, reviewer name appears as "By REVIEWER_NAME"    

                            ## Splitting at the end is to remove "By" to get only the actual reviewer name    

                            reviewer_name = reviewer.find("p", {"class":"pr-rd-details pr-rd-author-nickname"}).te                                                                           xt.split('\n')[-1].strip()    

                            reviewers_name.append(reviewer_name)   


                    ## extract "isVerified" information    

                    isVerified = soup.find_all("span", {"class": "pr-rd-badging-text"})   


                    ## extract the fit feedback and customer measurements data (review_metadata)    

                    review_data = soup.find_all("article", {"class": "pr-review"})    

                    review_metadata_raw = []   


                    for i in range(len(review_data)):    

                            review_metadata_raw.append(review_data[i].find("div", {"class": "pr-accordion-conten                                                                          t"})) 

     

                    ## extract HTML elements which contain review metadata    

                    review_metadata_elements = [review_metadata_raw[i].find_all("dl", {"class", "pr-rd-def-list"                                                                                                                               })    

                            if review_metadata_raw[i] is not None else None     

                            for i in range(len(review_metadata_raw))]   


                    ## extract actual data from HTML elements    

                    review_metadata = []    

                    for element in review_metadata_elements:    

                            if element is None:    

                                    review_metadata.append(None)    

                                    continue    

                            ## <dt> elements contain metadata field name like "fit", "length" etc    

                            ## <dd> elements contain reviewer's response for those metadata fields like "small",                              "just right" etc 

                             review_metadata.append([(element[i].find("dt").text.lower(), element[i].find("dd").text.                                                                  lower())    

                                                         if element is not None else ""     

                                                         for i in range(len(element))])   


                    ## extract review text    

                    review_text = [txt.text for txt in soup.find_all("p", {"class": "pr-rd-description-text"})]    

                    review_summary = [txt.text for txt in soup.find_all("h2", {"class": "pr-rd-review-headline"})] 

     

                    ## extract item id    

                    item_id = soup.find("div", {"class": "product-number"}).find("span").text   


                    ## extract item category    

                     try:    

                            category = soup.find("a", {"class":"breadcrumb-element"}).text.lower()    

                    except AttributeError:  ## if category not present, item is not available    

                            time.sleep(15 + random.randint(0,10))    

                            break   


                     ## extract available product sizes    

                     product_sizes = [i.text.strip().lower() for i in soup.find("ul", {"class": "swatches size"})    

                                                 .find_all("li", {"class": "selectable variation-group-value"})]    

                     item_info = {"category": category, "item_id": item_id, "product_sizes": product_sizes}    


                     ## consolidate all the extracted data    

                     ## ignore records which don't have any review metadata as fit feedback is an essential sig                       nal for us 

                     scraped_data.extend([merge_two_dicts({"review_text": review_text[j], "review_summary":

                                                       review_summary[j]},    merge_two_dicts(merge_two_ dicts({

                                                       "user_name":reviewers_name[j]},    

                                                        {data[0]:data[1] for data in review_metadata[j]})    

                                                         ,item_info))    

                               for j in range(len(reviewer_details)) if review_metadata_raw[j] is not None])   


                     ## if current page is the initial one, it contains only NEXT button (PREVIOUS is missing)   

                     if init == 0:   

                             try:   

                                     init = 1   

                                     ## execute click on NEXT by utilizing the xpath of NEXT    

                                     browser.execute_script("arguments[0].click();",    browser.find_element_by_xpath                                                                      ('//*[@id="pr-review-display"]/footer/div/aside/button'))                                  time.sleep(10 + random.randint(0,5))   

                              except NoSuchElementException: ## No NEXT button present, less than 10 reviews                                    time.sleep(15 + random.randint(0,10))   

                                      break   


                   else:   

                   try:   

                           ## execute click on NEXT by utilizing the xpath of NEXT    

                           ## if you notice, the xpath of NEXT is different here since PREVIOUS button is also pre                            sent now   

                           browser.execute_script("arguments[0].click();",   browser.find_element_by_xpath('//*[@                                                              id="pr-review-display"]/footer/div/aside/button[2]'))   

                           time.sleep(10 + random.randint(0,5))   

                    except  NoSuchElementException: ## No NEXT button, no more pages left    

                                time.sleep(15 + random.randint(0,10))    

                                break   


            ## save the extracted data locally    

            np.save('./scraped_data_tops.npy',scraped_data)   

    需要注意的幾點:

    我們在許多地方做過異常處理。當我在運行腳本時遇到問題時,這些處理都會逐步添加進去。

    第 30-97 行負責將感興趣的數據提取出來并解析為字典格式。通常,人們更喜歡將提取的數據存儲在本地并離線解析,但是,由于筆記本電腦的存儲空間限制,我更喜歡在線進行分析。

    Selenium 在第 99-119 行中很有用。由于不同頁面的 URL 不會更改,所以導航的唯一方法是模擬按鈕單擊。我們已經使用「NEXT」按鈕的 xpath 來完成同樣的工作。

    xpath 可用于瀏覽 XML 文檔中的元素和屬性。要標識元素的 xpath,請轉到 inspect,右鍵單擊 HTML 代碼并復制 xpath,如下圖所示。

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    獲取 HTML 元素的 xpath 的方法;在本例中,為「NEXT」按鈕

    這就完成了數據提取和分析過程,之后我們數據中的記錄將如下圖所示:

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    看起來,我們的工作已經完成了。但是,仍然有幾個步驟可以構建最終的數據集。

    步驟 3:構建數據集

    到目前為止,我們所擁有的數據質量在以下幾個維度上有一些改進空間:

    數據清洗

    到目前為止提取的數據可能缺少一些基本的數據信息或者記錄,謝謝數據可以被安全地處理掉。例如:
    有很多關于 ModCloth 的評論,它們不包含是否合身的反饋或購買產品尺寸信息。盡管我們放棄了第 64-66 行中不包含任何相關信息的評論,但也存在一些包含相關信息但不包含某些基本數據信息的評論。

    我們注意到,ModCloth 上評論人的信息并沒有和任何特定的 ID 關聯。這對我們來說是另一個挑戰,因為用戶 ID 是必不可少的數據。為了解決這個問題,我們可以將評論者的昵稱與打分值連接起來,以形成一個唯一的字符串。我們可以字符串要求至少包含 3 個字段信息,以減少數據集中由于不同的評論者得到相同的 ID 而產生的干擾。然后就可以安全地刪除不存在此類信息的所有記錄。

    此外,很少有記錄顯示產品目錄尺寸中沒有的采購尺寸(可能是報告錯誤),因此我們也拋棄了這些記錄。

    匿名處理

    為了保護隱私,需要對用戶和條目的詳細信息進行匿名處理。在 ModCloth 數據集中有一些敏感的屬性,比如身體尺寸數據,我們可以隨機生成用戶 ID 和條目 ID。如果我們提取的是非公開的數據信息,這一點就變得更加重要了。

    標準化

    數據中可能存在一些屬性,這些屬性在所有記錄中的含義可能并不完全相同。在這種情況下,我們需要使用直覺(或一些基線)來標準化數據集中的屬性。例如,ModCloth 上的不同產品可能有不同的尺碼單位(比如牛仔褲在美國和中國有完全不同的尺碼單位)。因此,在我們標準化所有記錄的數據之前,數據集基本上是不可用的。

    處理這一問題的一種方法是利用 ModCloth 上的尺寸表,它將不同單位的尺寸轉換為統一的標準。然而,有些產品中仍然存在一些單位未知的尺寸。我們可以利用我們的直覺將它們轉換為標準尺度,或者刪除數據不確定的評論。

    結構化

    在我們完成了所有的預處理之后,我們要做的事情就是將數據結構轉換成常見的格式,如 csv、json 等,以便讓對數據集感興趣的人能夠很容易地讀取和導入數據。

    結束語

    完成上述所有步驟后,數據中的記錄可能如下圖所示:

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    吸收知識的最好方法就是動手實踐,所以同學們現在就可以找個數據集,開始練手啦!

    via:https://towardsdatascience.com/a-practical-guide-to-collecting-ml-datasets-476f1ecf5e35

    雷鋒網雷鋒網

    雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

    亞馬遜工程師分享:如何抓取、創建和構造高質量的數據集

    分享:
    相關文章
    當月熱門文章
    最新文章
    請填寫申請人資料
    姓名
    電話
    郵箱
    微信號
    作品鏈接
    個人簡介
    為了您的賬戶安全,請驗證郵箱
    您的郵箱還未驗證,完成可獲20積分喲!
    請驗證您的郵箱
    立即驗證
    完善賬號信息
    您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
    立即設置 以后再說