主頁 >  其他 > 使用NLP和ML來提取和構造Web資料

使用NLP和ML來提取和構造Web資料

2020-10-31 00:23:35 其他

作者|Conner Brew
編譯|VK
來源|Towards Data Science

介紹

在本文中,我們將創建一個基于戰爭研究所(ISW)的結構化檔案資料庫,ISW為外交和情報專業人員提供資訊產品,以加深對世界各地發生的沖突的了解,

要查看與本文相關聯的原始代碼和Notebook,請訪問以下鏈接:https://colab.research.google.com/drive/1pTrOXW3k5VQo1lEaahCo79AHpyp5ZdfQ?usp=sharing

要訪問Kaggle上托管的最終結構化資料集,請訪問以下鏈接:https://www.kaggle.com/connerbrew2/isw-web-scrape-and-nlp-enrichment

本文將是一個關于web抽取、自然語言處理(NLP)和命名物體識別(NER)的練習,對于NLP,我們將主要使用開源Python庫NLTK和Spacy,

本文旨在演示web提取和NLP的一個用例,而不是關于這兩種技術使用的全面初學者教程,如果你是NLP或web提取的新手,我建議你遵循不同的教程,或者瀏覽Spacy、BeautifulSoup和NLTK檔案頁面,

# 匯入庫

import requests
import nltk
import math
import re
import spacy
import regex as re
import pandas as pd
import numpy as np
import statistics as stats
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import json

# 你需要從NLTK下載一些包,

from bs4 import BeautifulSoup 
from nltk import *
nltk.download('stopwords')
nltk.download('punkt')
from nltk.corpus import stopwords

# #在大多數環境中,你需要安裝NER-D,

!pip install ner-d
from nerd import ner

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.text import TfidfVectorizer

初始化變數

首先,我們將初始化最終結構化資料中需要的資料欄位,對于每個檔案,我要提取標題、發布日期、人名、地名和其他各種資訊,我們還將增強檔案中已經存在的資訊—例如,我們將使用檔案中的地名來獲取相關的坐標,這對于以后可視化資料非常有用,

# 初始化最終資料集的資料欄位

dates=[]
titles=[]
locations=[]
people=[]
key_countries=[]
content_text=[]
links=[]
coord_list=[]
mentioned_countries=[]
keywords=[]
topic_categories=[]

# 為后面的主題模型初始化簇變數

cluster_keywords=[]
cluster_number=[]

# 使用SPACY庫初始化NLP物件
nlp = spacy.load("en_core_web_sm")

提取href

我們將從ISW的生產庫中提取檔案,首先,我們將抓取“瀏覽”頁面以獲取每個產品的單獨href鏈接,然后我們將這些鏈接存盤在一個串列中,供提取函式稍后訪問,

# #從ISW瀏覽頁面獲取產品鏈接

urls=['http://www.understandingwar.org/publications?page={}'.format(i) for i in range(179)]
hrefs=[]

def get_hrefs(page,class_name):
  page=requests.get(page)
  soup=BeautifulSoup(page.text,'html.parser')
  container=soup.find_all('div',{'class':class_name})
  container_a=container[0].find_all('a')
  links=[container_a[i].get('href') for i in range(len(container_a))]
  for link in links:
    if link[0]=='/':
      hrefs.append('http://www.understandingwar.org'+link)

for url in urls:
  get_hrefs(url,'view-content')

Web爬取

我們將要撰寫的前幾個函式是相當簡單的文本提取,本教程不是關于BeautifulSoup用法的教程,要了解Python中的web爬取,請查看這里的檔案:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

獲得日期

對于我們的第一個函式,我們將提取發布日期,它掃描從產品網頁中提取的html檔案,并找到一個類為“submitted”的欄位,這是我們的生產日期,

獲得標題

接下來,我們需要產品名稱,同樣,這個欄位被方便地標記為“title”類,

獲取所有文本

最后,我們將提取檔案的全文,當我提取文本時,我通常遵循“先提取,后過濾”的web提取方式,這意味著,在最初的文本提取中,我對文本執行最少的過濾和處理,我更愿意在以后的分析中進行處理,因為這是必要的,但是,如果你想更進一步,你可能希望對提取的文本進行比下面函式演示的更多的預處理,

對于我的get_contents函式,我堅持最基本的原則——我在黑名單中列出了一些不想被提取的文本,然后從頁面中提取所有文本并將其附加到一個臨時字串中,該字串又被附加到串列content_text中,

# 提取發布資料

def get_date(soup):
  try:
    data=https://www.cnblogs.com/panchuangai/archive/2020/10/29/soup.find('span',{'class':'submitted'})
    content=data.find('span')
    date=content.get('content')
    dates.append(date)
  except Exception:
    dates.append('')
    pass

# 提取產品標題
def get_title(soup):
  try:
    title=soup.find('h1',{'class':'title'}).contents
    titles.append(title[0])
  except Exception:
    titles.append('')
    pass

# 提取產品的文本內容
def get_contents(soup):
  try:
    parents_blacklist=['[document]','html','head',
                       'style','script','body',
                       'div','a','section','tr',
                       'td','label','ul','header',
                       'aside',]
    content=''
    text=soup.find_all(text=True)
  
    for t in text:
      if t.parent.name not in parents_blacklist and len(t) > 10:
        content=content+t+' '

    content_text.append(content)
  except Exception:
    content_text.append('')
    pass

自然語言處理

接下來,我們將找出產品中參考了哪些國家,有很多API可以用于檢查國家的文本內容,但這里我們將使用一個簡單的方法:列出世界上所有國家的串列,這個串列來自維基百科:https://en.wikipedia.org/wiki/Lists_of_countries_and_territories

在函式得到all_mentioned_countries 后,它使用基本統計分析來確定哪些國家最突出——這些國家最有可能成為檔案敘述的焦點,為此,該函式計算整個檔案中提到一個國家的次數,然后查找比平均值提到次數多的國家,然后將這些國家追加到key_countries串列中,

# 在正文中參考所有國家的串列,
# 如果文本中的一個單詞與串列中的一個國家匹配,那么它將被添加到國家串列中, 

def get_countries(content_list):
  iteration=1
  for i in range(len(content_list)):
    print('Getting countries',iteration,'/',len(content_list))
    temp_list=[]
    for word in word_tokenize(content_list[i]):
      for country in country_list:
        if word.lower().strip() == country.lower().strip():
          temp_list.append(country)

    counted_countries=dict(Counter(temp_list))
    temp_dict=dict.fromkeys(temp_list,0)
    temp_list=list(temp_dict)
    if len(temp_list)==0:
      temp_list.append('Worldwide')
    mentioned_countries.append(temp_list)

    # 計算每個國家被提及的次數,然后對照平均值檢查每次計數, 
    # 如果一個國家被提及的次數超過了平均次數,它就會作為一個關鍵字被記錄,

    keywords=[]
    for key in counted_countries.keys():
      if counted_countries[key] > np.mean(list(counted_countries.values())):
        keywords.append(key)
    if len(keywords) != 0:
      key_countries.append(keywords)
    else:
      key_countries.append(temp_list)
    iteration+=1

命名物體識別:地點

接下來,我們要豐富我們的資料,最終,結構化資料的目標通常是執行某種分析或可視化——在這種國際沖突資訊的情況下,將資訊按地理位置繪制出來是很有價值的,為此,我們需要與檔案對應的坐標,

找到地名

首先,我們將使用自然語言處理(NLP)和命名物體識別(NER)從文本中提取地名,

NLP是機器學習的一種形式,計算機演算法使用語法和語法規則來學習文本中單詞之間的關系,通過這種學習,NER能夠理解某些單詞在句子或段落中所起的作用,本教程并不打算全面介紹NLP—對于這樣的資源,請查看:https://medium.com/@ODSC/an-introduction-to-natural-language-processing-nlp-8e476d9f5f59

從外部API獲取坐標

為了找到地名的坐標,我們將使用 Open Cage API查詢坐標;你可以在這里創建一個免費帳戶并接收API密鑰,還有許多其他流行的地理api可供選擇,但通過反復試驗,我發現Open-Cage在中東地區有著最好的性能,

首先,我們迭代從檔案中檢索到的每個地名,并在Open Cage中查詢它,一旦完成這項作業,我們將對比Open Cage與先前創建的mentioned_countries 串列,這將確保我們檢索的查詢結果位于正確的位置,

# 使用NLP提取地名,然后查詢open-cage API以獲得繪圖所需的坐標

# 插入你自己的OpenCage API key:
geo_api_key='Insert Your API Key Here'

def get_coords(content_list):
  iteration=1
  for i in range(len(content_list)):
    print('Getting coordinates',iteration,'/',len(content_list))
    temp_list=[]
    text=content_list[i]

    # 應用一個NER演算法,從python庫'ner-d'中查找地名,

    doc=nlp(text)
    location=[X.text for X in doc.ents if X.label_ == 'GPE']
    location_dict=dict.fromkeys(location,0)
    location=list(location_dict)


    # 查詢位置,
    
    for l in location:
      try: 
        request_url='https://api.opencagedata.com/geocode/v1/json?q={}&key={}'.format(l,geo_api_key)
        page=requests.get(request_url)
        data=https://www.cnblogs.com/panchuangai/archive/2020/10/29/page.json()
        for n in range(len(data)):

          # 這行代碼檢查查詢結果中的國家是否與mentioned_countries之一相匹配,如果不是,那么查詢結果很可能是假正例,

          if data['results'][n]['components']['country'] in mentioned_countries[i]:
            lat=data['results'][n]['geometry']['lat']
            lng=data['results'][n]['geometry']['lng']
            coordinates={'Location': l,
                          'Lat': lat,
                          'Lon': lng}
            temp_list.append(coordinates)
            break
          else:
            continue    
      except Exception: 
        continue
    coord_list.append(temp_list)
    iteration+=1

命名物體識別:人

接下來,我們將提取檔案中提到的人的姓名,為此,我們將再次使用NER-d python庫中的NER演算法,

獲取全名

在最終的結構化資料中,我只想要全名,只找到“Jack”或“John”的資料,會不會令人困惑?為此,我們將再次使用一些基本的統計資料,當提到全名時,函式將跟蹤全名,通常是在文本的開頭,

當后面提到部分名稱時,它將參考全名串列,以標識部分名稱參考的是誰,例如,如果一篇新聞文章是這樣寫的:“喬·拜登正在競選總統,喬是前總統奧巴馬的副總統,我們知道喬指的是拜登,因為他的全名在文中早些時候已經給出,此函式將以相同的方式運行,

重復的名字

如果出現了重復的情況,該函式將使用前面用于國家/地區函式的相同統計資料,它將測量一個名字被提及的次數,并將其作為最有可能的名字,例如:喬·拜登和他的兒子亨特·拜登都是受歡迎的美國政治家,喬·拜登是前副總統,拜登現在正在與現任總統唐納德·特朗普競選總統”,根據文本的統計重點,這篇文章顯然是關于喬·拜登,而不是亨特·拜登,

驗證名字

一旦函式計算出所有提到的全名,它將把它們添加到一個串列中,然后,它將查詢維基百科中的每個名字,以驗證它是否是值得包含在結構化資料中的有影響力的人的名字,

def get_people(content_list):
  iteration=1

  # 使用NER在文本中查找人名,
  
  for i in range(len(content_list)):
    print('Getting people',iteration,'/',len(content_list))
    temp_list=[]
    text=content_list[i]
    doc=nlp(text)
    persons=[X.text for X in doc.ents if X.label_ == 'PERSON']
    persons_dict=dict.fromkeys(persons,0)
    persons=list(persons_dict)

    full_names=[]
    for person in persons: 
      if len(word_tokenize(person)) >= 2:
        string_name=re.sub(r"[^a-zA-Z0-9]+", ' ', person).strip()
        full_names.append(string_name)
  
    final_names=[]
    for person in persons:
      for name in full_names:
        tokens=word_tokenize(name)
        for n in range(len(tokens)):
          if person==tokens[n]:
            final_names.append(name)

    for name in full_names:
      final_names.append(name)

    name_dict=dict.fromkeys(final_names,0)
    final_names=list(name_dict)
    valid_names=[]

    for name in final_names:
      page=requests.get('https://en.wikipedia.org/wiki/'+name)
      if page.status_code==200:
        valid_names.append(name)

    people.append(valid_names)
    iteration+=1

關鍵詞提取:TF-IDF

我們的下一個任務是從文本中提取關鍵字,最常見的方法是使用一種稱為TF-IDF的方法,TF-IDF模型測量單個檔案中單詞的使用頻率,然后將其與整個檔案語料庫中的平均使用率進行比較,

如果一個術語在單個檔案中頻繁使用,并且很少在整個檔案語料庫中使用,那么該術語很可能表示該特定檔案特有的關鍵字,這篇文章并不是一篇關于TF-IDF模型的全面概述,要了解更多資訊,請查看這篇關于Medium的文章:https://medium.com/datadriveninvestor/tf-idf-in-natural-language-processing-8db8ef4a7736

首先,我們的函式將創建通常所說的“詞袋”,這將跟蹤每個檔案中使用的每個單詞,然后,它將計算每個檔案中每個單詞的每次使用次數—單詞頻率(TF),然后,它計算逆檔案頻率(IDF),然后將這些值寫入矩陣中的坐標,然后對矩陣進行排序,以幫助我們找到最有可能表示檔案的單詞,

# 第一個函式通過降低字符大小寫和洗掉特殊字符對文本進行預處理,

def pre_process(text):
    text=text.lower()
    text=re.sub("</?.*?>"," <> ",text)
    text=re.sub("(\\d|\\W)+"," ",text)
    return text

# 這個函式將矩陣映射到坐標,TF-IDF函式將頻率分數映射到矩陣,然后需要對這些矩陣進行排序,以幫助我們找到關鍵字, 

def sort_coo(coo_matrix):
    tuples = zip(coo_matrix.col, coo_matrix.data)
    return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True)

# 與上面一樣,這是一個幫助函式,一旦頻率映射到矩陣,它將幫助排序和選擇關鍵字, 
# 這個函式專門幫助我們根據TF-IDF統計資料選擇最相關的關鍵字

def extract_topn_from_vector(feature_names, sorted_items, topn=10):
    sorted_items = sorted_items[:topn]
    score_vals = []
    feature_vals = []

    for idx, score in sorted_items:
        fname = feature_names[idx]
        score_vals.append(round(score, 3))
        feature_vals.append(feature_names[idx])

    results= {}
    for idx in range(len(feature_vals)):
        results[feature_vals[idx]]=score_vals[idx]
    return results

#最后一個函式包含了上述helper函式,它對正文應用TF-IDF演算法,根據使用頻率查找關鍵字,

def get_keywords(content_list):
  iteration=1
  processed_text=[pre_process(text) for text in content_list]
  stop_words=set(stopwords.words('english'))
  cv=CountVectorizer(max_df=0.85,stop_words=stop_words)
  word_count_vector=cv.fit_transform(processed_text)

  tfidf_transformer=TfidfTransformer(smooth_idf=True,use_idf=True)
  tfidf_transformer.fit(word_count_vector)

  feature_names=cv.get_feature_names()

  for i in range(len(processed_text)):
    print('Getting Keywords',iteration,'/',len(content_list))
    doc=processed_text[i]
    tf_idf_vector=tfidf_transformer.transform(cv.transform([doc]))
    sorted_items=sort_coo(tf_idf_vector.tocoo())
    keys=extract_topn_from_vector(feature_names,sorted_items,10)
    keywords.append(list(keys.keys()))
    iteration+=1

主題模型

NLP中最常見的任務之一就是主題模型,這是一種聚類形式,它嘗試根據檔案的文本內容自動對檔案進行分類,在這個具體的例子中,我想一眼就知道ISW涉及哪些主題,通過根據文本內容對檔案進行分類,我可以輕松地對檔案的主要思想有一個大致的了解,

向量化

對于這個例子,我將使用k-means聚類演算法來進行主題建模,首先,我將再次使用TF-IDF演算法對每個檔案進行向量化,向量化是一個機器學習術語,指的是將非數字資料轉換成計算機可以用來執行機器學習任務的數字空間資料,

優化

一旦檔案被向量化,helper函式就會檢查簇的最佳數量,(k表示k-means的k),在本例中,最佳數目是50,一旦我找到了最佳的數字,在這個例子中,我注釋掉了這行代碼,并手動將引數調整為等于50,這是因為我正在分析的資料集不會經常更改,所以我可以期望隨著時間的推移,最佳簇的數量會保持不變,對于變化更頻繁的資料,你應該回傳最佳的簇數量作為變數-這將幫助你的聚類演算法自動設定其最佳引數,我在我的時間序列分析文章中展示了一個例子,

聚類

每個簇完成后,我將每個簇的編號(1–50)保存到簇編號的串列中,而組成每個簇的關鍵字保存到cluster_keywords的串列中,這些簇關鍵字稍后將用于向每個主題簇添加標題,

# 該函式根據各種“k”引數檢查聚類演算法,以找到“k”的最優值,

def find_optimal_clusters(data, max_k):
    iters = range(2, max_k+1, 2)
    
    sse = []
    for k in iters:
        sse.append(MiniBatchKMeans(n_clusters=k, 
                                   init_size=1024, 
                                   batch_size=2048,
                                   random_state=20).fit(data).inertia_)
        
        print('Fit {} clusters'.format(k))
        
    f, ax = plt.subplots(1, 1)
    ax.plot(iters, sse, marker='o')
    ax.set_xlabel('Cluster Centers')
    ax.set_xticks(iters)
    ax.set_xticklabels(iters)
    ax.set_ylabel('SSE')
    ax.set_title('SSE by Cluster Center Plot')

# 從內容串列中獲取關鍵詞來幫助對主題模型的分類

def get_top_keywords(data, clusters, labels, n_terms):
  df = pd.DataFrame(data.todense()).groupby(clusters).mean()
  for i,r in df.iterrows():
    cluster_keywords.append(','.join([labels[t] for t in np.argsort(r)[-n_terms:]]))
    
# 應用于主題建模的內容串列

def get_topics(content_list):
  processed_text=[pre_process(text) for text in content_list]
  stop_words=set(stopwords.words('english'))
  cv=CountVectorizer(max_df=0.85,stop_words=stop_words)
  word_count_vector=cv.fit_transform(processed_text)

  tfidf_transformer=TfidfTransformer(smooth_idf=True,use_idf=True)
  tfidf_transformer.fit(word_count_vector)

  feature_names=cv.get_feature_names()
  vector=tfidf_transformer.transform(cv.transform(processed_text))

  #find_optimal_clusters(vector,50)

  clusters = MiniBatchKMeans(n_clusters=50, init_size=1024, batch_size=2048, random_state=20).fit_predict(vector)
  for cluster in clusters:
    cluster_number.append(int(cluster))
  
  get_top_keywords(vector, clusters, cv.get_feature_names(), 20)

放在一起

最后,我們將提取我們的資料,使用我們之前得到的href串列,現在是將所有提取函式應用于web內容的時候了,

# 遍歷從“browse”中提取的href,提取相關內容

iteration=1

# 前幾個函式依賴于原始提取的web內容作為引數,這些都是基本的web抓取技術,

for href in hrefs:
  print('Web scraping: iteration',iteration,'/',len(hrefs))
  page=requests.get(href)
  soup=BeautifulSoup(page.text,'html.parser')
  links.append(href)
  get_date(soup)
  get_title(soup)
  get_contents(soup)
  iteration+=1

# 下面這些函式依賴于文本主體作為引數,
# 這些是基于nlp的函式,

# 注意:由于查詢外部API,
# 需要一個超時來阻止服務器過載,
# 這部分代碼的運行時間很長,

get_countries(content_text)
get_coords(content_text)
get_people(content_text)
get_keywords(content_text)
get_topics(content_text)

豐富主題模型

我們的下一個問題是:我們的簇為我們提供了一個與每個簇相關聯的單詞串列,但是簇的名稱僅僅是數字,這使我們有機會繪制一個詞云或其他有趣的可視化圖,可以幫助我們理解每個簇,但對于結構化資料集中的一目了然的理解來說,它并沒有那么有用,另外,我認為有些檔案可能屬于多個主題類別,k-means不支持多重聚類,因此我必須手動識別這些檔案,首先,我將列印前幾行關鍵字,以了解我正在處理的資料,

與每個主題相關聯的一些關鍵字,我們將使用這些關鍵字將簇分類到預定義的類別中,

在對各種技術進行了大量實驗之后,我決定采用一種非常簡單的方法,我掃描了與每個簇相關的每個關鍵字串列,并在每個與特定主題相關的關鍵字中記錄了重要的關鍵字,在這個階段,領域知識是關鍵,例如,我知道,ISW檔案中的阿勒頗幾乎肯定提到了敘利亞內戰,對于你的資料,如果你缺乏適當的領域知識,你可能需要做進一步的研究,咨詢你團隊中的其他人,或者定義一個更高級的編程方法來命名簇,

然而,對于這個例子,簡單的方法很有效,在記錄了簇串列中存在的幾個重要關鍵字之后,我自己制作了幾個串列,其中包含了與結構化資料中我想要的最終主題類別相關聯的關鍵字,該函式簡單地將每個簇的關鍵字串列與我創建的串列進行比較,然后根據串列中的匹配項分配主題名稱,然后將這些最后的主題附加到主題類別串列中,

#搜索與主題對應的關鍵詞串列,與聚類詞庫交叉參考,為每篇文章分配一個主題類別,

oir=['OIR Iraq','yezidis','mosul','peshmerga','isis','iraq','sinjar','baghdad','maliki',
     'daquq','anbar','isf','abadi','malaki','ramadi','iraqi','fallujah','dabiq']

terrorism=['Terrorism','jihadi','islamic','salafi','qaeda',
           'caliphate','isis','terrorist','terrorism']

syrian_conflict=['Syrian Conflict','sana','syria','assad',
                 'idlib','afrin','aleppo']

russia=['Russia','russia','belarus','slavic','kremlin','russian',
        'minsk','ukraine','putin']

iran=['Iran','iran','iranian','proxy','militias','militia','marjah']

turkey=['Turkey','erdogan','turkish','turkey']

ors=['ORS','kabul','ghani','pakistan','afghan','afghanistan',
     'taliban','ansf','karzai','helmand']

africa=['Africa','libya','libyan','egypt','egyptian','africa','african']

cat_list=[oir,terrorism,syrian_conflict,russia,iran,turkey,ors,africa]

topic_dict={}

for i in range(len(cluster_keywords)):
  temp_list=[]
  for n in nltk.word_tokenize(cluster_keywords[i]):
    for item in cat_list:
      if n in item:
        temp_list.append(item[0])
  
  temp_dict=dict.fromkeys(temp_list,0)
  temp_list=list(temp_dict)

  topic_dict[i] = temp_list

for num in cluster_number:
  topic_categories.append(topic_dict[num])

資料庫創建

最后一步是將我們提取的所有資料集中起來,對于這些資料,我更喜歡JSON格式,這是因為我想以不同的方式組織某些型別的資料—例如,locations欄位將包含地名、緯度和經度的字典串列,在我看來,JSON格式是將這種格式化的資料存盤到本地磁盤的最有效的方法,我還在檔案資料庫MongoDB中備份了這個資料庫的副本,但這不是本文的重點,

#將一個空串列初始化

db=[]

for i in range(len(hrefs)):
  countries={
      'focus area': key_countries[i],
      'all mentioned countries': mentioned_countries[i]
  }

  # 將函式中定義的所有串列添加到新的存盤串列中

  doc={ 
      '_id': len(hrefs) - i,
       'title': titles[i],
       'date': dates[i],
       'places': coord_list[i],
       'people': people[i],
       'keywords': keywords[i],
       'countries': countries,
       'full text': content_text[i],
       'url': links[i],
       'topic cluster': cluster_number[i],
       'categories': topic_categories[i]
  }

  db.append(doc)

# 將串列保存為谷歌驅動器內的.JSON資料存盤檔案(用于演示目的)

with open ('/content/drive/My Drive/Colab Notebooks/isw_products.json', 'w') as fout:
  json.dump(db, fout)

摘要

現在我們結束了!我們從網頁中提取鏈接,然后使用這些鏈接從網站中提取更多內容,我們使用這些內容,然后使用外部api、ML簇演算法和NLP來提取和增強這些資訊,TF-IDF向量化、關鍵字提取和主題模型,這些是NLP的基石,如果你有更多問題或需要資訊,請聯系我們,祝你在未來的NLP中好運!

原文鏈接:https://towardsdatascience.com/something-from-nothing-use-nlp-and-ml-to-extract-and-structure-web-data-3f49b2f72b13

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方檔案:
http://sklearn123.com/

歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196036.html

標籤:其他

上一篇:電子郵件分類的最佳機器學習演算法

下一篇:神經網路簡史

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more