計算文本相似度的幾種方法

計算文本相似度的幾種方法

大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們來探討一下計算文本相似度的幾種方法。文本相似度在自然語言處理(NLP)領域中有著廣泛的應用,包括搜索引擎、推薦系統、文本分類等。下面我們將介紹幾種常用的文本相似度計算方法,并給出相應的Java代碼示例。

一、Jaccard相似度

Jaccard相似度是一種簡單而有效的文本相似度度量方法。它通過計算兩個集合的交集與并集的比值來衡量相似度。公式如下:

[ \text{Jaccard Similarity} = \frac{|A \cap B|}{|A \cup B|} ]

在Java中可以使用如下代碼計算Jaccard相似度:

package cn.juwatech.similarity;import java.util.HashSet;
import java.util.Set;public class JaccardSimilarity {public static double computeJaccardSimilarity(String text1, String text2) {Set<String> set1 = new HashSet<>(Set.of(text1.split("\\s+")));Set<String> set2 = new HashSet<>(Set.of(text2.split("\\s+")));Set<String> intersection = new HashSet<>(set1);intersection.retainAll(set2);Set<String> union = new HashSet<>(set1);union.addAll(set2);return (double) intersection.size() / union.size();}public static void main(String[] args) {String text1 = "I love programming in Java";String text2 = "Java programming is fun";double similarity = computeJaccardSimilarity(text1, text2);System.out.println("Jaccard Similarity: " + similarity);}
}

二、余弦相似度

余弦相似度通過計算兩個向量之間的夾角余弦值來衡量相似度。它在處理高維數據時非常有效,公式如下:

[ \text{Cosine Similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| |\mathbf{B}|} ]

在Java中可以使用如下代碼計算余弦相似度:

package cn.juwatech.similarity;import java.util.HashMap;
import java.util.Map;public class CosineSimilarity {public static double computeCosineSimilarity(String text1, String text2) {Map<String, Integer> vector1 = getTermFrequency(text1);Map<String, Integer> vector2 = getTermFrequency(text2);double dotProduct = 0.0;for (String key : vector1.keySet()) {if (vector2.containsKey(key)) {dotProduct += vector1.get(key) * vector2.get(key);}}double magnitude1 = 0.0;for (int value : vector1.values()) {magnitude1 += Math.pow(value, 2);}double magnitude2 = 0.0;for (int value : vector2.values()) {magnitude2 += Math.pow(value, 2);}return dotProduct / (Math.sqrt(magnitude1) * Math.sqrt(magnitude2));}private static Map<String, Integer> getTermFrequency(String text) {Map<String, Integer> termFrequency = new HashMap<>();for (String term : text.split("\\s+")) {termFrequency.put(term, termFrequency.getOrDefault(term, 0) + 1);}return termFrequency;}public static void main(String[] args) {String text1 = "I love programming in Java";String text2 = "Java programming is fun";double similarity = computeCosineSimilarity(text1, text2);System.out.println("Cosine Similarity: " + similarity);}
}

三、編輯距離(Levenshtein距離)

編輯距離是衡量兩個字符串之間差異的一種方法,表示將一個字符串轉換成另一個字符串所需的最少編輯操作次數(插入、刪除、替換)。

在Java中可以使用如下代碼計算編輯距離:

package cn.juwatech.similarity;public class LevenshteinDistance {public static int computeLevenshteinDistance(String text1, String text2) {int[][] dp = new int[text1.length() + 1][text2.length() + 1];for (int i = 0; i <= text1.length(); i++) {for (int j = 0; j <= text2.length(); j++) {if (i == 0) {dp[i][j] = j;} else if (j == 0) {dp[i][j] = i;} else {dp[i][j] = min(dp[i - 1][j - 1] + costOfSubstitution(text1.charAt(i - 1), text2.charAt(j - 1)), dp[i - 1][j] + 1, dp[i][j - 1] + 1);}}}return dp[text1.length()][text2.length()];}private static int costOfSubstitution(char a, char b) {return a == b ? 0 : 1;}private static int min(int... numbers) {int minValue = Integer.MAX_VALUE;for (int number : numbers) {if (number < minValue) {minValue = number;}}return minValue;}public static void main(String[] args) {String text1 = "kitten";String text2 = "sitting";int distance = computeLevenshteinDistance(text1, text2);System.out.println("Levenshtein Distance: " + distance);}
}

四、應用場景

  1. 搜索引擎:在搜索引擎中,計算文本相似度可以用于匹配用戶查詢和網頁內容,從而提高搜索結果的相關性。
  2. 推薦系統:在推薦系統中,計算用戶之間的文本相似度可以幫助發現具有相似興趣的用戶,從而進行個性化推薦。
  3. 文本分類:在文本分類任務中,通過計算文本相似度可以將相似的文本歸為一類,從而提高分類精度。

總結

計算文本相似度的方法多種多樣,不同的方法適用于不同的應用場景。Jaccard相似度適用于集合相似度計算,余弦相似度適用于高維向量相似度計算,編輯距離適用于字符串相似度計算。在實際應用中,可以根據具體需求選擇合適的相似度計算方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37168.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37168.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法訓練 | 動態規劃Part10 | 300.最長遞增子序列、674.最長連續遞增序列、718.最長重復子數組

目錄 300.最長遞增子序列 動態規劃法 674.最長連續遞增序列 動態規劃法 718.最長重復子數組 動態規劃法 300.最長遞增子序列 題目鏈接&#xff1a;300. 最長遞增子序列 - 力扣&#xff08;LeetCode&#xff09; 文章講解&#xff1a;代碼隨想錄 動態規劃法 “子序列是…

基于java語言+springboot技術架構開發的 互聯網智能3D導診系統源碼支持微信小程序、APP 醫院AI智能導診系統源碼

基于java語言springboot技術架構開發的 互聯網智能3D導診系統源碼支持微信小程序、APP 醫院AI智能導診系統源碼 一、智慧導診系統開發原理 導診系統從原理上大致可分為基于規則模板和基于數據模型兩類。 1、基于規則推理的方法通過人工建立癥狀、疾病和科室之間的對應規則實現…

Java反射API詳解與應用場景

一、Java反射API簡介: 一、什么是反射: 反射是一種強大的工具,它允許我們在運行時檢查類、方法和字段的信息,甚至允許我們動態的調用特定類的方法或改變字段的值。編程語言中的反射機制通常用于從類、對象或方法中檢索元數據,或者更特別的說,從代碼本身中獲取信息。這就…

【51單片機入門】點亮數碼管

文章目錄 前言仿真圖如何去繪制一個數字示例代碼選擇某個數碼管顯示某個數字 示例代碼總結 前言 在嵌入式系統的世界中&#xff0c;單片機扮演著至關重要的角色。51單片機&#xff0c;作為最早的微控制器之一&#xff0c;至今仍被廣泛應用在各種設備中。本文將介紹如何使用51單…

幾種linux開機自啟腳本的方法

幾種linux開機自啟腳本的方法 1. 腳本添加到init.d目錄中2. 創建服務service&#xff08;推薦&#xff09;3. /etc/profile & /etc/profile.d&#xff08;不推薦&#xff09;4. /etc/rc.local 本文以啟動jenkins節點為例&#xff0c;需要持久連接&#xff0c;實現開機自啟 …

js或ts中對象如何循環遍歷獲取名字和值

數組循環有多種方法&#xff0c;但是對象循環還是會遇到一些問題 分開獲取key或value let names{name:kaka,age:12}獲取key值代碼&#xff1a; Object.keys(names).forEach(name>{console.log(name) })結果&#xff1a; 獲取value值代碼&#xff1a; Object.values(name…

多地高溫持續“熱力”爆表 約克VRF中央空調帶你清涼舒爽一夏

“出門5分鐘&#xff0c;流汗2小時”,夏季高溫天氣&#xff0c;怎一個“熱”字了得&#xff1f;6月以來&#xff0c;我國多地迎來高溫“炙烤”&#xff0c;全國出現40℃以上高溫的范圍持續增加&#xff0c;隨著中央氣象臺高溫預警持續拉響&#xff0c;人們都很納悶&#xff1a;…

谷歌瀏覽器報錯ERR_UNSAFF_PORT原因分析

部署了個測試靜態頁&#xff0c;用了10080端口。curl訪問沒問題&#xff0c;chrome瀏覽器訪問報錯 ERR_UNSAFF_PORT 查了一下&#xff0c;google對于部分端口在客戶端是直接攔截的。請求都不會到服務器 定義在這里 谷歌官網源碼&#xff1a;chromium.googlesource.com git…

Android 大話binder通信

戳藍字“牛曉偉”關注我哦&#xff01; 用心堅持輸出易讀、有趣、有深度、高質量、體系化的技術文章 由于 Android 大話binder通信(上) 和 Android 大話binder通信(下) 分為兩篇閱讀體驗不好&#xff0c;顧合并為一篇。 本文摘要 用故事的方式把binder通信的整個過程都描述…

【408考點之數據結構】棧:定義、特點、基本操作與應用

棧&#xff1a;定義、特點、基本操作與應用 棧是一種重要的線性數據結構&#xff0c;廣泛應用于計算機科學和編程中。本文將介紹棧的定義、特點、基本操作以及常見應用。 棧的定義 棧&#xff08;Stack&#xff09;是一種特殊的線性表&#xff0c;只允許在表的一端進行插入和…

TFMath Caculator:一個簡單的Java AWT計算器

目錄 背景&#xff1a; 代碼展示: 代碼解析: 輸出結果: 總結: 背景&#xff1a; 使用Java AWT(Abstract Window Toolkit)庫創建的簡單計算器應用-TFMath Calculator。這個計算器允許用戶輸入兩個數字&#xff0c;點擊號按鈕后&#xff0c;計算器會計算這兩個數字的和&…

在文件末尾添加以下行來添加CRAN鏡像(適合你的Ubuntu版本,例如focal):添加的是ubuntu16.04版本

ChatGPT 如果你的Ubuntu版本是16.04&#xff08;Xenial Xerus&#xff09;&#xff0c;則應該使用適合該版本的CRAN鏡像。下面是具體的步驟&#xff1a; 在Ubuntu 16.04上更新R到較新版本 添加CRAN鏡像&#xff1a; 打開終端并編輯APT源列表文件&#xff1a; bash 復制代碼 …

計算機網絡之OSI七層體系結構

目錄 1.物理層 1.1物理層組成 1.2物理層功能 1.3物理層服務 1.4物理層標準 1.5物理層接口 2.數據鏈路層 2.1基于物理層的問題 2.2數據鏈路層功能 2.3數據鏈路層服務 2.4數據鏈路層協議 3.網絡層 3.1基于DL層的問題 3.2網絡層功能 3.3網絡層服務 3.4網絡層協議 …

Django 靚號管理系統:實現登錄功能

本文將詳細介紹如何在 Django 靚號管理系統中實現登錄功能,包括用戶認證、驗證碼生成、以及中間件的使用。我們將逐步展示所有相關代碼,并附帶詳細注釋。 1. 項目結構 首先,讓我們看一下項目的基本結構: number ├── manage.py ├── monaco.ttf ├── number │ …

Linux下的SSH詳解及Ubuntu教程

前言 SSH&#xff08;Secure Shell&#xff09;是一種用于計算機之間安全通信的協議&#xff0c;廣泛應用于遠程登錄、系統管理和文件傳輸等場景。本文將詳細介紹SSH在Linux系統&#xff08;特別是Ubuntu&#xff09;下的使用&#xff0c;包括安裝、配置、密鑰管理和常見應用&…

怎么加快音頻播放速度?加快音頻播放器的四種方法介紹

怎么加快音頻播放速度&#xff1f;許多音樂愛好者對各種類型的歌曲充滿了熱情&#xff0c;這些歌曲節奏輕快或者緩慢不一&#xff0c;但通常默認的播放速度都是一倍速。有時候&#xff0c;一些旋律悠揚的曲子可能聽起來有些慢&#xff0c;這時候一些朋友可能想要嘗試加快節奏&a…

easyquotation獲取港股的bug

easyquotation&#xff1a;實時股票數據獲取 easyquotation庫&#xff0c;是一個非常好用的實時股票數據獲取庫&#xff0c;可以實時獲取新浪、騰訊的免費股票行情&#xff0c;集思路的分級基金行情 安裝 項目地址&#xff1a;https://github.com/shidenggui/easyquotation.…

鴻蒙開發 之 健康App案例

1.項目介紹 該項目是記錄用戶日常飲食情況&#xff0c;以及針對不同食物攝入營養不同會有對應的營養攝入情況和日常運動消耗情況&#xff0c;用戶可以自己添加食品以及對應的熱量。 1.1登陸頁 1.2飲食統計頁 1.3 食物列表頁 2.登陸頁 2.1自定義彈框 import preferences from oh…

IP地址查詢和代理服務器:雙重保護隱私

隨著網絡應用的日益普及&#xff0c;我們的個人信息和數據安全面臨前所未有的挑戰。在此背景下&#xff0c;IP地址查詢和代理服務器成為保護個人隱私和網絡安全的兩大關鍵工具。本文將從IP地址查詢的原理和應用出發&#xff0c;深入剖析代理服務器在網絡隱私保護中的作用&#…

掌握批處理的高級技巧:使用正則表達式

掌握批處理的高級技巧&#xff1a;使用正則表達式 在Windows批處理腳本編寫中&#xff0c;正則表達式是一個強大的工具&#xff0c;它可以幫助我們進行復雜的字符串匹配和處理。雖然批處理腳本本身并不直接支持正則表達式&#xff0c;但我們可以通過一些技巧和外部工具來實現正…