2020年文檔相似性算法:初學者教程

2021-02-07 磐創AI


作者 | Masatoshi Nishimura 

編譯 | VK 

來源 | Towards Data Science

如果你想知道2020年文檔相似性任務的最佳算法,你來對了地方。

在33914篇《紐約時報》文章中,我測試了5種常見的文檔相似性算法。從傳統的統計方法到現代的深度學習方法。

每個實現少於50行代碼。所有使用的模型都來自網際網路。因此,你可以在沒有數據科學知識的情況下,開箱即用,並且得到類似的結果。

在這篇文章中,你將學習如何實現每種算法以及如何選擇最佳算法。內容如下:

你想深入自然語言處理和人工智慧。你想用相關的建議來增加用戶體驗。你想升級舊的現有算法。那麼你會喜歡這個文章的。

數據科學家主張絕對最好

你可能會搜索術語「最佳文檔相似性算法」(best document similarity algorithms)。

然後你將從學術論文,博客,問答中得到搜索結果。一些側重於特定算法的教程,而另一些則側重於理論概述。

在學術論文中,一個標題說,這種算法的準確率達到了80%,而其他算法的準確率僅為75%。好啊。但是,這種差異是否足以讓我們的眼睛注意到它呢?增加2%怎麼樣?實現這個算法有多容易?科學家傾向於在給定的測試集中追求最好,而忽略了實際意義。

在相關的問題問答中,狂熱的支持者佔據了整個話題。有人說現在最好的算法是BERT。這個算法概念是如此具有革命性,它打敗了一切。另一方面,憤世嫉俗者稱一切都取決於工作。有些答案早在深度學習之前就有了。看看這個Stackoverflow(https://stackoverflow.com/questions/8897593/how-to-compute-the-similarity-between-two-text-documents)。2012年是投票最多的一年,很難判斷它對我們到底意味著什麼。

谷歌會很樂意投入數百萬美元購買工程師的能力和最新的計算能力,僅僅是為了將他們的搜索能力提高1%。這對我們來說可能既不現實也沒有意義。

性能增益和實現所需的技術專業知識之間有什麼權衡?它需要多少內存?它以最少的預處理可以運行多快?

你想知道的是一種算法在實際意義上是如何優於另一種算法的。

這篇文章將為你提供一個指導方針,指導你在文檔相似性問題應該實現哪種算法。

各種算法,通篇流行文章,預訓練模型

本實驗有4個目標:

通過在同一個數據集上運行多個算法,你將看到算法與另一個算法的公平性以及公平程度。

通過使用來自流行媒體的全文文章作為我們的數據集,你將發現實際應用程式的有效性。

通過只使用公開可用的預訓練模型,你將能夠設置自己的文檔相似性並得到類似的輸出。

「預訓練模型是你的朋友。-Cathal Horan」

❞數據設置-5篇基礎文章

本實驗選取了33914篇《紐約時報》的文章。從2018年到2020年6月。數據主要是從RSS中收集的,文章的平均長度是6500個字符。

從這些文章中選擇5個作為相似性搜索的基礎文章。每一個代表一個不同的類別。

在語義類別的基礎上,我們還將度量書面格式。更多的描述在下面。

Lifestyle, Human Interest:How My Worst Date Ever Became My Best(https://www.nytimes.com/2020/02/14/style/modern-love-worst-date-of-my-life-became-best.html)Science, Informational:A Deep-Sea Magma Monster Gets a Body Scan(https://www.nytimes.com/2019/12/03/science/axial-volcano-mapping.html)Business, News:Renault and Nissan Try a New Way After Years When Carlos Ghosn Ruled(https://www.nytimes.com/2019/11/29/business/renault-nissan-mitsubishi-alliance.html)Sports, News:Dominic Thiem Beats Rafael Nadal in Australian Open Quarterfinal(https://www.nytimes.com/2020/01/29/sports/tennis/thiem-nadal-australian-open.html)Politics, News:2020 Democrats Seek Voters in an Unusual Spot: Fox News(https://www.nytimes.com/2019/04/17/us/politics/fox-news-democrats-2020.html)判斷標準

我們將使用5個標準來判斷相似性的性質。如果你只想查看結果,請跳過此部分。

標籤是最接近人類判斷內容相似性的工具。記者自己親手寫下標籤。你可以在HTML標題中的news_keywords meta標記處檢查它們。使用標籤最好的部分是我們可以客觀地測量兩個內容有多少重疊。每個標籤的大小從1到12不等。兩篇文章的標籤重疊越多,就越相似。

第二,我們看這個部分。這就是《紐約時報》在最高級別對文章進行分類的方式:科學、政治、體育等等。在網址的域名後面會進行顯示,例如nytimes.com/…

第二部分是小節。例如,一個版塊可以細分為world,或者world可以細分為Australia。並不是所有的文章都包含它,它不像以上那2個那麼重要。

第四是文風。大多數文檔比較分析只關注語義。但是,由於我們是在實際用例中比較推薦,所以我們也需要類似的寫作風格。例如,你不想在學術期刊的「跑鞋和矯形術」之後,從商業角度閱讀「十大跑鞋」。我們將根據傑斐遜縣學校的寫作指導原則對文章進行分組。該列表包括人類興趣、個性、最佳(例如:產品評論)、新聞、操作方法、過去的事件和信息。

5個候選算法

這些是我們將要研究的算法。

每一個算法對33914篇文章運行,以找出得分最高的前3篇文章。對於每一篇基礎文章,都會重複這個過程。

輸入的是文章的全文內容。標題被忽略。

請注意,有些算法並不是為文檔相似性而構建的。但是在網際網路上有如此不同的意見,我們將親眼看到結果。

我們將不關注概念理解,也不關注詳細的代碼審查。相反,其目的是展示問題的設置有多簡單。如果你不明白以下算法的細節,不要擔心,你可以閱讀其他優秀博客進行理解

你可以在Github repo中找到整個代碼庫:https://github.com/massanishi/document_similarity_algorithms_experiments

如果你只想查看結果,請跳過此部分。

Jaccard

Jaccard 在一個多世紀前提出了這個公式。長期以來,這一概念一直是相似性任務的標準。

幸運的是,你會發現jaccard是最容易理解的算法。數學很簡單,沒有向量化。它可以讓你從頭開始編寫代碼。

而且,jaccard是少數不使用餘弦相似性的算法之一。它標記單詞並計算交集。

我們使用NLTK對文本進行預處理。

步驟:

import string
import nltk

nltk.download('stopwords')
nltk.download('wordnet')
nltk.download('punkt')

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

base_document = "This is an example sentence for the document to be compared"
documents = ["This is the collection of documents to be compared against the base_document"]

def preprocess(text):
 # 步驟:
 # 1. 小寫字母
 # 2. 詞根化
 # 3. 刪除停用詞
 # 4. 刪除標點符號
 # 5. 刪除長度為1的字符

 lowered = str.lower(text)

 stop_words = set(stopwords.words('english'))
 word_tokens = word_tokenize(lowered)

 words = []
 for w in word_tokens:
  if w not in stop_words:
   if w not in string.punctuation:
    if len(w) > 1:
     lemmatized = lemmatizer.lemmatize(w)
     words.append(lemmatized)

 return words

def calculate_jaccard(word_tokens1, word_tokens2):
 # 結合這兩個標識來找到併集。
 both_tokens = word_tokens1 + word_tokens2
 union = set(both_tokens)

 # 計算交集
 intersection = set()
 for w in word_tokens1:
  if w in word_tokens2:
   intersection.add(w)

 jaccard_score = len(intersection)/len(union)
 return jaccard_score

def process_jaccard_similarity():

 # 標記我們要比較的基本文檔。
 base_tokens = preprocess(base_document)

 # 標記每一篇文檔
 all_tokens = []
 for i, document in enumerate(documents):
  tokens = preprocess(document)
  all_tokens.append(tokens)

  print("making word tokens at index:", i)

 all_scores = []
 for tokens in all_tokens:
  score = calculate_jaccard(base_tokens, tokens)

  all_scores.append(score)

 highest_score = 0
 highest_score_index = 0
 for i, score in enumerate(all_scores):
  if highest_score < score:
   highest_score = score
   highest_score_index = i

 most_similar_document = documents[highest_score_index]

 print("Most similar document by Jaccard with the score:", most_similar_document, highest_score)

process_jaccard_similarity()

TF-IDF

這是自1972年以來出現的另一種成熟算法。經過幾十年的測試,它是Elasticsearch的默認搜索實現。

Scikit learn提供了不錯的TF-IDF的實現。TfidfVectorizer允許任何人嘗試此操作。

利用scikit-learn的餘弦相似度計算TF-IDF詞向量的結果。我們將在其餘的例子中使用這種餘弦相似性。餘弦相似性是許多機器學習任務中使用的一個非常重要的概念,可能值得你花時間熟悉一下。

多虧了scikit learn,這個算法產生了最短的代碼行。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

base_document = "This is an example sentence for the document to be compared"
documents = ["This is the collection of documents to be compared against the base_document"]

def process_tfidf_similarity():
 vectorizer = TfidfVectorizer()

 # 要生成統一的向量,首先需要將兩個文檔合併。
 documents.insert(0, base_document)
 embeddings = vectorizer.fit_transform(documents)

 cosine_similarities = cosine_similarity(embeddings[0:1], embeddings[1:]).flatten()

 highest_score = 0
 highest_score_index = 0
 for i, score in enumerate(cosine_similarities):
  if highest_score < score:
   highest_score = score
   highest_score_index = i


 most_similar_document = documents[highest_score_index]

 print("Most similar document by TF-IDF with the score:", most_similar_document, highest_score)

process_tfidf_similarity()

Doc2vec

Word2vec於2014年面世,這讓當時的開發者們刮目相看。你可能聽說過非常有名的一個例子:

國王 - 男性 = 女王

Word2vec非常擅長理解單個單詞,將整個句子向量化需要很長時間。更不用說整個文件了。

相反,我們將使用Doc2vec,這是一種類似的嵌入算法,將段落而不是每個單詞向量化。你可以看看這個博客的介紹:https://medium.com/wisio/a-gentle-introduction-to-doc2vec-db3e8c0cce5e

不幸的是,對於Doc2vec來說,沒有官方預訓練模型。我們將使用其他人的預訓練模型。它是在英文維基百科上訓練的(數字不詳,但模型大小相當於1.5gb):https://github.com/jhlau/doc2vec

Doc2vec的官方文檔指出,輸入可以是任意長度。一旦標識化,我們輸入整個文檔到gensim庫。

from gensim.models.doc2vec import Doc2Vec
from sklearn.metrics.pairwise import cosine_similarity

import string
import nltk

nltk.download('stopwords')
nltk.download('wordnet')
nltk.download('punkt')

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

base_document = "This is an example sentence for the document to be compared"
documents = ["This is the collection of documents to be compared against the base_document"]

def preprocess(text):
 # 步驟:
 # 1. 小寫字母
 # 2. 詞根化
 # 3. 刪除停用詞
 # 4. 刪除標點符號
 # 5. 刪除長度為1的字符

 lowered = str.lower(text)

 stop_words = set(stopwords.words('english'))
 word_tokens = word_tokenize(lowered)

 words = []
 for w in word_tokens:
  if w not in stop_words:
   if w not in string.punctuation:
    if len(w) > 1:
     lemmatized = lemmatizer.lemmatize(w)
     words.append(lemmatized)

 return words

def process_doc2vec_similarity():

 # 這兩種預先訓練的模型都可以在jhlau的公開倉庫中獲得。
 # URL: https://github.com/jhlau/doc2vec

 # filename = './models/apnews_dbow/doc2vec.bin'
 filename = './models/enwiki_dbow/doc2vec.bin'

 model= Doc2Vec.load(filename)

 tokens = preprocess(base_document)

 # 只處理出現在doc2vec預訓練過的向量中的單詞。enwiki_ebow模型包含669549個詞彙。
 tokens = list(filter(lambda x: x in model.wv.vocab.keys(), tokens))

 base_vector = model.infer_vector(tokens)

 vectors = []
 for i, document in enumerate(documents):

  tokens = preprocess(document)
  tokens = list(filter(lambda x: x in model.wv.vocab.keys(), tokens))
  vector = model.infer_vector(tokens)
  vectors.append(vector)

  print("making vector at index:", i)

 scores = cosine_similarity([base_vector], vectors).flatten()

 highest_score = 0
 highest_score_index = 0
 for i, score in enumerate(scores):
  if highest_score < score:
   highest_score = score
   highest_score_index = i

 most_similar_document = documents[highest_score_index]
 print("Most similar document by Doc2vec with the score:", most_similar_document, highest_score)

process_doc2vec_similarity()

Universal Sentence Encoder (USE)

這是Google最近在2018年5月發布的一個流行算法。實現細節:https://www.tensorflow.org/hub/tutorials/semantic_similarity_with_tf_hub_universal_encoder。

我們將使用谷歌最新的官方預訓練模型:Universal Sentence Encoder 4(https://tfhub.dev/google/universal-sentence-encoder/4).

顧名思義,它是用句子來構建的。但官方文件並沒有限制投入規模。沒有什麼能阻止我們將它用於文檔比較任務。

整個文檔按原樣插入到Tensorflow中。沒有進行標識化。

from sklearn.metrics.pairwise import cosine_similarity

import tensorflow as tf
import tensorflow_hub as hub

base_document = "This is an example sentence for the document to be compared"
documents = ["This is the collection of documents to be compared against the base_document"]

def process_use_similarity():
 filename = "./models/universal-sentence-encoder_4"

 model = hub.load(filename)

 base_embeddings = model([base_document])

 embeddings = model(documents)

 scores = cosine_similarity(base_embeddings, embeddings).flatten()

 highest_score = 0
 highest_score_index = 0
 for i, score in enumerate(scores):
  if highest_score < score:
   highest_score = score
   highest_score_index = i

 most_similar_document = documents[highest_score_index]
 print("Most similar document by USE with the score:", most_similar_document, highest_score)

process_use_similarity()

BERT

這可是個重量級選手。2018年11月谷歌開源BERT算法。第二年,谷歌搜索副總裁發表了一篇博文,稱BERT是他們過去5年來最大的飛躍。

它是專門為理解你的搜索查詢而構建的。當談到理解一個句子的上下文時,BERT似乎比這裡提到的所有其他技術都要出色。

最初的BERT任務並不打算處理大量的文本輸入。對於嵌入多個句子,我們將使用UKPLab(來自德國大學)出版的句子轉換器開源項目(https://github.com/UKPLab/sentence-transformers),其計算速度更快。它們還為我們提供了一個與原始模型相當的預訓練模型(https://github.com/UKPLab/sentence-transformers#performance)

所以每個文檔都被標記成句子。並對結果進行平均,以將文檔表示為一個向量。

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from nltk import sent_tokenize

from sentence_transformers import SentenceTransformer

base_document = "This is an example sentence for the document to be compared"
documents = ["This is the collection of documents to be compared against the base_document"]

def process_bert_similarity():
 # 這將下載和加載UKPLab提供的預訓練模型。
 model = SentenceTransformer('bert-base-nli-mean-tokens')

 # 雖然在句子轉換器的官方文件中並沒有明確的說明,但是原來的BERT是指一個更短的句子。我們將通過句子而不是整個文檔來提供模型。
 sentences = sent_tokenize(base_document)
 base_embeddings_sentences = model.encode(sentences)
 base_embeddings = np.mean(np.array(base_embeddings_sentences), axis=0)

 vectors = []
 for i, document in enumerate(documents):

  sentences = sent_tokenize(document)
  embeddings_sentences = model.encode(sentences)
  embeddings = np.mean(np.array(embeddings_sentences), axis=0)

  vectors.append(embeddings)

  print("making vector at index:", i)

 scores = cosine_similarity([base_embeddings], vectors).flatten()

 highest_score = 0
 highest_score_index = 0
 for i, score in enumerate(scores):
  if highest_score < score:
   highest_score = score
   highest_score_index = i

 most_similar_document = documents[highest_score_index]
 print("Most similar document by BERT with the score:", most_similar_document, highest_score)

process_bert_similarity()

算法評估

讓我們看看每種算法在我們的5篇不同類型的文章中的表現。我們根據得分最高的三篇文章進行比較。

在這篇博文中,我們將只介紹五種算法中性能最好的算法的結果。有關完整的結果以及個別文章連結,請參閱倉庫中的算法目錄:https://github.com/massanishi/document_similarity_algorithms_experiments

1. How My Worst Date Ever Became My Best

BERT勝利

這篇文章是一個人類感興趣的故事,涉及一個50年代離婚婦女的浪漫約會。

這種寫作風格沒有像名人名字這樣的特定名詞。它對時間也不敏感。2010年的一個關於人類興趣的故事在今天可能也同樣重要。在比較中沒有一個算法性能特別差。

BERT和USE的比賽千鈞一髮。USE把故事繞到了社會問題,BERT關注浪漫和約會。其他算法則轉向了家庭和孩子的話題,可能是因為看到了「ex husband 前夫」這個詞。

2. A Deep-Sea Magma Monster Gets a Body Scan

TF-IDF獲勝。

這篇科學文章是關於海洋中活火山的三維掃描。

3D掃描、火山和海洋是罕見的術語。所有算法都很好地實現了公平。

TF-IDF正確地選擇了那些只談論地球海洋內火山的人。USE與它相比也是一個強大的競爭者,它的重點是火星上的火山而不是海洋。另一些算法則選擇了有關俄羅斯軍用潛艇的文章,這些文章與科學無關,與主題無關。

3. Renault and Nissan Try a New Way After Years When Carlos Ghosn Ruled

TF-IDF獲勝。

文章談到了前執行長卡洛斯·戈恩越獄後雷諾和日產的遭遇。

理想的匹配將討論這3個實體。與前兩篇相比,本文更具有事件驅動性和時間敏感性。相關新聞應與此日期或之後發生(從2019年11月開始)。

TF-IDF正確地選擇了關注日產CEO的文章。其他人則選擇了一些談論通用汽車行業新聞的文章,比如菲亞特克萊斯勒(Fiat Chrysler)和標緻(Peugeot)的結盟。

值得一提的是,Doc2vec和USE生成了完全相同的結果。

4. Dominic Thiem Beats Rafael Nadal in Australian Open Quarterfinal

Jaccard、TF-IDF和USE結果相似。

這篇文章是關於網球選手多米尼克·蒂姆在2020年澳大利亞網球公開賽(網球比賽)上的文章。

新聞是事件驅動的,對個人來說非常具體。所以理想的匹配是多米尼克和澳大利亞公開賽。

不幸的是,這個結果由於缺乏足夠的數據而受到影響。他們都談論網球。但有些比賽是在談論2018年法國網球公開賽的多米尼克。或者,在澳大利亞網球公開賽上對費德勒的看法。

結果是三種算法的結果。這說明了關鍵的重要性:我們需要盡最大努力收集、多樣化和擴展數據池,以獲得最佳的相似性匹配結果。

5. 2020 Democrats Seek Voters in an Unusual Spot: Fox News

USE勝利。

這篇文章是關於民主黨人的,特別關注伯尼·桑德斯在福克斯新聞(Fox News)上為2020年大選出鏡。

每一個話題都有自己的大問題。關於民主黨候選人和選舉的文章很多。因為這個故事的主旨是新穎的,所以我們優先討論民主黨候選人和福克斯的關係。

旁註:在實踐中,你要小心對待政治上的建議。把自由和保守的新聞混合在一起很容易讓讀者不安。既然我們是單獨和《紐約時報》打交道,那就不必擔心了。

USE找到了一些關於伯尼·桑德斯和福克斯、微軟全國廣播公司等電視頻道的文章。其他人則選擇了一些討論2020年大選中其他民主黨候選人的文章。

速度之王

在結束贏家之前,我們需要談談運行時間。每種算法在速度方面表現得非常不同。

結果是,TF-IDF的實施比任何其他方法都快得多。要在單個CPU上從頭到尾計算33914個文檔(標識化、向量化和比較),需要:

TF-IDF只花了一分半鐘。這是USE的2.5%。當然,你可以合併多種效率增強。但潛在收益需要討論。這將使我們有另一個理由認真審視相關的利弊權衡。

以下是5篇文章中的每一篇的贏家算法。

從結果可以看出,對於新聞報導中的文檔相似性,TF-IDF是最佳候選。如果你使用它的最小定製,這一點尤其正確。考慮到TF-IDF是發明的第二古老的算法,這也令人驚訝。相反,你可能會失望的是,現代先進的人工智慧深度學習在這項任務中沒有任何意義。

當然,每種深度學習技術都可以通過訓練自己的模型和更好地預處理數據來改進。但所有這些都伴隨著開發成本。你想好好想想,相對於TF-IDF方法,這種努力會帶來額外多大的好處。

最後,可以說我們應該完全忘記Jaccard和Doc2vec的文檔相似性。與今天的替代品相比,它們沒有帶來任何好處。

新手推薦

假設你決定從頭開始在應用程式中實現相似性算法,下面是我的建議。

1.先實施TF-IDF

最快的文檔相似性匹配是TF-IDF,儘管有深度學習的各種宣傳,例如深度學習給你一個高質量的結果。但是TFIDF最棒的是,它是閃電般的快。

正如我們所看到的,將其升級到深度學習方法可能會或不會給你帶來更好的性能。在計算權衡時,必須事先考慮很多問題。

2.積累更好的數據

Andrew Ng給出了一個類似的建議。你不能指望你的車沒有油就跑。油必須是好的。

文檔相似性依賴於數據的多樣性,也依賴於特定的算法。你應該盡你最大的努力找到唯一的數據來增強你的相似性結果。

3.升級到深度學習

僅當你對TF-IDF的結果不滿意時,才遷移到USE或BERT以升級模型。你需要考慮計算時間。你可能會預處理詞嵌入,因此你可以在運行時更快地處理相似性匹配。谷歌為此寫了一篇教程:https://cloud.google.com/solutions/machine-learning/building-real-time-embeddings-similarity-matching-system

4.調整深度學習算法

你可以慢慢升級你的模型。訓練你自己的模型,將預訓練好的知識融入特定的領域,等等。今天也有許多不同的深度學習模式。你可以一個一個的來看看哪一個最適合你的具體要求。

文檔相似性是許多NLP任務之一

你可以使用各種算法實現文檔的相似性:一些是傳統的統計方法,另一些是尖端的深度學習方法。我們已經在紐約時報的文章中看到了它們之間的比較。

使用TF-IDF,你可以在本地筆記本電腦上輕鬆啟動自己的文檔相似性。不需要昂貴的GPU。不需要大內存。你仍然可以得到高質量的數據。

誠然,如果你想做情緒分析或分類等其他任務,深入學習應該適合你的工作。但是,當研究人員試圖突破深度學習效率和成績界限時,我們要意識到生活在炒作的圈子裡是不健康的。它給新來的人帶來巨大的焦慮和不安全感。

堅持經驗主義可以讓我們看到現實。

希望這個博客鼓勵你開始自己的NLP項目。

參考閱讀An article covering TF-IDF and Cosine similarity with examples: 「Overview of Text Similarity Metrics in Python「:https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50An academic paper discussing how cosine similarity is used in various NLP machine learning tasks: 「Cosine Similarity」:https://www.sciencedirect.com/topics/computer-science/cosine-similarityDiscussion of sentence similarity in different algorithms: 「Text Similarities : Estimate the degree of similarity between two texts」:https://medium.com/@adriensieg/text-similarities-da019229c894An examination of various deep learning models in text analysis: 「When Not to Choose the Best NLP Model」:https://blog.floydhub.com/when-the-best-nlp-model-is-not-the-best-choice/Conceptual dive into BERT model: 「A review of BERT based models」:https://towardsdatascience.com/a-review-of-bert-based-models-4ffdc0f15d58A literature review on document embeddings: 「Document Embedding Techniques」:https://towardsdatascience.com/document-embedding-techniques-fed3e7a6a25d

原文連結:https://towardsdatascience.com/the-best-document-similarity-algorithm-in-2020-a-beginners-guide-a01b9ef8cf05

相關焦點

  • 教程| 初學者如何選擇合適的機器學習算法(附速查表)
    選自sas機器之心編譯參與:黃小天、蔣思源、吳攀本文主要的目標讀者是機器學習愛好者或數據科學的初學者,以及對學習和應用機器學習算法解決實際問題抱有濃厚興趣的讀者。面對大量的機器學習算法,初學者通常會問自己一個典型的問題:「我該使用哪一種算法?」
  • 學界| Facebook新論文介紹相似性搜索新突破:在GPU上實現十億規模
    選自arXiv.org機器之心編譯作者:吳攀相似性搜索的規模和速度一直是研究者努力想要克服的難題。近日,Facebook 人工智慧研究團隊在 arXiv 發布的新論文《Billion-scale similarity search with GPUs》宣稱在這一問題上取得了重大進展,在 GPU 上實現了十億規模級的相似性搜索。
  • 資源 | Scikit-learn中文文檔,一份完美的實踐教程
    Scikit-learn 目前主要由社區成員自發進行維護,且專注於構建機器學習領域內經廣泛驗證的成熟算法。Scikit-learn 項目最早為數據科學家 David Cournapeau 於 2007 年發起的 scikits.learn 項目,且 Scikit 的名字可視為 SciPy Toolkit,即 SciPy 的第三方擴展。
  • 資源 | 你需要的Scikit-learn中文文檔:步入機器學習的完美實踐教程
    該文檔自 2017 年 11 月初步完成校對,目前很多細節都已經得到完善。該中文文檔包含了分類、回歸、聚類和降維等經典機器學習任務,並提供了完整的使用教程與 API 注釋。入門讀者也可以藉此文檔與教程從實踐出發進入數據科學與機器學習的領域。
  • 算法基礎:五大排序算法Python實戰教程
    :五大排序算法Python實戰教程排序算法的複雜度排序是每個軟體工程師和開發人員都需要掌握的技能。不同的排序算法很好地展示了算法設計上如何強烈的影響程序的複雜度、運行速度和效率。讓我們看一下前6種排序算法,看看如何在Python中實現它們!
  • Python官方中文文檔強勢來襲
    Python 官方支持的文檔一直沒有中文。小夥伴們已經習慣了原汁原味的英文文檔,但如果有官方中文文檔,對於初學者來說,門檻會大大的降低。
  • 南方CASS教程附下載
    CAD\南方CASS教程\9、文檔教程\14、CASS教程2.pptCAD\南方CASS教程\9、文檔教程\15、CASS教程3.pptCAD\南方CASS教程\9、文檔教程\16、CASS教程4.pptCAD\南方CASS
  • Anki 學習指南(優質資源 & 教程總結)
    並且 Anki 的廣大用戶一直熱衷於推廣這款強大的間隔重複算法軟體,為此撰寫了很多 Anki 教程。為了徹底掌握 Anki,我看過許多教程。雖然 Anki 教程豐富,卻良莠不一。有的教程本意雖好,但由於作者對 Anki 一知半解,難免有誤人子弟之嫌。
  • 常用的相似性度量算法(原理,實現,優缺點,適用場景...
    內容導讀對相似性算法的了解起源於最近在做 使用協同過濾原理 的推薦系統中, 基於鄰域的推薦算法 (User-Based CF和 和 Item-Based CF)需要估算不同樣本之間的 相似性度量(Similarity Measurement) ,這也是機器學習中在做 分類 的時候的一個常見場景。
  • 一起學人工智慧:推薦算法並不難,相似性是基礎,來看看相似算法
    今天我們來講一講,常見的物品/用戶相似性的評分算法。曼哈頓距離評價算法曼哈頓距離評價算法與歐幾裡德距離評價算法非常的接近,曼哈頓距離是由十九世紀的赫爾曼·閔可夫斯基提出了的一種衡量兩點距離的算法,曼哈頓距離的計算為每個維度的差值的絕對值之和,像上述例子種,我們使用曼哈頓距離評價算法,計算出來的結果為abs(4-3)+ abs(4-4.5) + abs
  • 初學者怎麼學動漫繪畫?動漫初學者入門教程
    初學者怎麼學動漫繪畫?動漫初學者入門教程!零基礎小白學動漫繪畫,通常是比較困難的,很多時候都是靠一股熱血支撐,但由於種種原因, 那種激情就會消退,久而久之就學不下去了。面對這種情況,小白們也很無奈,所以今天,小編給小白們送福利啦!告訴你零基礎小白學動漫繪畫應該怎麼學。
  • 【算法】TF-IDF算法及應用
    所以,自動提取關鍵詞的算法就很清楚了,就是計算出文檔的每個詞的TF-IDF值,然後按降序排列,取排在最前面的幾個詞。還是以《中國的蜜蜂養殖》為例,假定該文長度為1000個詞,"中國"、"蜜蜂"、"養殖"各出現20次,則這三個詞的"詞頻"(TF)都為0.02。然後,搜索Google發現,包含"的"字的網頁共有250億張,假定這就是中文網頁總數。
  • 圖像相似性的5種度量方法
    和粒子濾波等都需要圖像相似性度量做理論支撐。03圖像相似性搜索的哈希算法圖像相似性搜索有直方圖方法,測量圖像灰度的概率分布;圖像模板匹配:對比的兩幅圖像大小不一致,採用滑動窗口度量;PSNR峰值信噪比:基於像素點之間的誤差做圖像質量評價;ssim的結構相似性檢測,從亮度、對比度、結構三方面度量圖像相似性。
  • Python官方中文文檔來了
    小夥伴們已經習慣了原汁原味的英文文檔,但如果有官方中文文檔,那麼查閱或理解速度都會大大提升。本文將介紹隱藏在 Python 官網的中文文檔~以前也是有一些第三方維護的 Python 中文文檔,不過可能因為人力等限制,並做不到同步更新與維護。目前也有很多高質量的 Python 中文資源,但大部分都是大牛寫的書或教程,官方文檔的翻譯並得不到保證。
  • 機器學習入門篇|面向初學者的十大機器學習算法
    該基金開始運作後,到2015年,儘管其管理的資產遠遠少於該基金,但其機器學習算法卻貢獻了該基金一半以上的利潤。在閱讀了這個博客之後,您將能夠理解一些流行的和令人難以置信的機器學習算法背後的基本邏輯,這些算法已經被交易社區所使用,並且作為您踏上創建最佳機器學習算法的基石。
  • 淺談鋼琴初學者基本教程如何選擇?
    關於鋼琴初學者基本教程,眾說不一,或許大部分鋼琴老師制定的都不太一樣,本文只是討論某部分教材的特點和作用,只供小夥伴參考學習用,實際鋼琴培訓時一切以老師安排的為準。《湯普森淺易鋼琴教程》,也就是《小湯》,《小湯》是採用中央c入門法,一課學習一個音,逐步推進的方式,好處是幼兒會學得比較紮實,不好的是很長一個階段雙手擠在中央c周圍較窄音域彈奏;到第三冊之後出現技術課題不夠明確,句法、連線差強人意等情況。
  • Anki 學習指南(優質資源 & 教程總結)搶鮮版
    但是 Anki 的廣大用戶一直熱衷於推廣這款強大的空間重複算法軟體,為此撰寫了很多 Anki 教程。為了徹底掌握神器 Anki,我看過許多教程。然而 Anki 教程雖豐富,卻良莠不一。Anki優質學習資料(教程)總結-2020-10-14-12-32-47漫畫中嵌入了運用空間重複算法與主動召回測試的卡片,讀者無需藉助專業軟體即能體驗:
  • 搜尋引擎自動提取關鍵詞技術《TF-IDF與餘弦相似性的應用》
    搜尋引擎自動提取關鍵詞技術《TF-IDF與餘弦相似性的應用》這個標題看上去好像很複雜,其實我要談的是一個很簡單的問題。
  • 床長人工智慧教程免費文檔——Apache Spark 初
    聲明:本人只是分享一些床長人工智慧教程相關的免費pdf文檔而已,並非床長人工智慧網校的收費文章。尊重版權,支持原創!同時更新在個人博客楔子楔子了解一項新技術的最好方式就是看官網源碼文檔它是一種快速通用的大數據分析引擎。是集批處理實時流處理交互式查詢計算於一體的。
  • 手把手 | 基於TextRank算法的文本摘要(附Python代碼)
    本文介紹了抽取型文本摘要算法TextRank,並使用Python實現TextRank算法在多篇單領域文本數據中抽取句子組成摘要的應用。文本摘要是自然語言處理(NLP)的應用之一,一定會對我們的生活產生巨大影響。隨著數字媒體的發展和出版業的不斷增長,誰還會有時間完整地瀏覽整篇文章、文檔、書籍來決定它們是否有用呢?值得高興的是,這項技術已經在這裡了。