最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)文本查重的方法詳解

 更新時間:2024年04月16日 14:30:47   作者:Barcke  
Ansj 是一個開源的 Java 中文分詞工具,基于中科院的 ictclas 中文分詞算法,采用隱馬爾科夫模型(HMM),比其他常用的開源分詞工具(如 MMseg4j)的分詞準確率更高,下面我們就來使用它實現(xiàn)文本查重功能吧

ansj 分詞法介紹

Ansj 是一個開源的 Java 中文分詞工具,基于中科院的 ictclas 中文分詞算法,采用隱馬爾科夫模型(HMM),比其他常用的開源分詞工具(如 MMseg4j)的分詞準確率更高。作者為孫健(ansjsun),目前實現(xiàn)了中文分詞、中文姓名識別、用戶自定義詞典、關鍵字提取、自動摘要、關鍵字標記等功能,適用于對分詞效果要求高的各種項目。 雖然 Ansj 分詞的基本原理與 ictclas 的一樣,但是 Ansj 做了一些工程上的優(yōu)化,比如:用 DAT 高效地實現(xiàn)檢索詞典、鄰接表實現(xiàn)分詞 DAG、支持自定義詞典與自定義消歧義規(guī)則等。

Ansj 分詞器 git地址: github.com/NLPchina/ansj_seg

配置文件

在ansj中配置文件名為library.properties,這是一個不可更改的約定。

字段名默認值說明
isNameRecognitiontrue是否開啟人名識別
isNumRecognitiontrue是否開啟數(shù)字識別
isQuantifierRecognitiontrue是否數(shù)字和量詞合并
isRealNamefalse是否取得真實的詞,默認情況會取得標注化后的
isSkipUserDefinefalse是否用戶辭典不加載相同的詞
diclibrary/default.dic自定義詞典路徑
dic_[key]你的詞典路徑針對不同語料調用不同的自定義詞典
ambiguitylibrary/ambiguity.dic歧義詞典路徑
ambiguity_[key]library/ambiguity.dic歧義詞典路徑
crfnullcrf 詞典路徑,不設置為默認
crf_[key]你的模型路徑針對不同語料調用不同的分詞模型
synonyms默認的同義詞典針對不同語料調用不同的分詞模型
synonyms_[key]你的同義詞典路徑針對不同語料調用不同的分詞模型

默認的配置文件:

#path of userLibrary this is default library
dic=library/default.dic

#redress dic file path
ambiguityLibrary=library/ambiguity.dic

#set real name
isRealName=true

#isNameRecognition default true
isNameRecognition=true

#isNumRecognition default true
isNumRecognition=true

#digital quantifier merge default true
isQuantifierRecognition=true

目前支持的分詞策略:

名稱用戶自定義詞典數(shù)字識別人名識別機構名識別新詞發(fā)現(xiàn)
BaseAnalysisXXXXX
ToAnalysisXX
DicAnalysisXX
IndexAnalysisXX
NlpAnalysis

計算余弦相似度

余弦相似度是常見的相似度衡量手段,能夠用以比對兩個向量間的相似水準。如下代碼呈現(xiàn)了計算兩篇論文之余弦相似度的方式:

余弦相似度是一種常用的計算兩個向量相似性的方法。它基于向量的點積和向量的模。

計算余弦相似度的原理如下:

  • 向量表示:將需要比較的對象表示為向量。
  • 點積運算:計算兩個向量的點積,即對應元素相乘后再求和。
  • 向量模的計算:分別計算每個向量的模,通常使用歐幾里得范數(shù)。
  • 計算余弦相似度:用兩個向量的點積除以它們的模的乘積。

具體公式為:

余弦相似度 = 向量 A 與向量 B 的點積 / (向量 A 的模 × 向量 B 的模)

余弦相似度的取值范圍在 -1 到 1 之間:

  • 值為 1:表示兩個向量完全相同,即具有最大相似度。
  • 值為 0:表示兩個向量相互垂直,即沒有相似性。
  • 值為 -1:表示兩個向量完全相反,即具有最小相似度。

余弦相似度的優(yōu)點包括:

  • 不受向量大小影響:它比較的是向量的方向,而不是它們的絕對大小。
  • 對噪聲相對不敏感:在存在一些噪聲或誤差的情況下仍能給出相對合理的相似度度量。

在實際應用中,余弦相似度常用于:

  • 文本相似性度量:比較文本向量的相似度。
  • 圖像相似性分析:衡量圖像特征向量的相似程度。
  • 推薦系統(tǒng):找到用戶或物品之間的相似性。
/**
     * 計算余弦相似度
     * @param vec1 map1
     * @param vec2 map2
     * @return 相似度
     */
    public double calculateCosSimilarity(Map<String, Integer> vec1, Map<String, Integer> vec2) {
        double dotProduct = 0.0;
        double norm1 = 0.0;
        double norm2 = 0.0;
        for (Map.Entry<String, Integer> entry : vec1.entrySet()) {
            String word = entry.getKey();
            int count = entry.getValue();
            dotProduct += count * vec2.getOrDefault(word, 0);
            norm1 += Math.pow(count, 2);
        }
        for (Map.Entry<String, Integer> entry : vec2.entrySet()){
            int count = entry.getValue();
            norm2 += Math.pow(count, 2);
        }
        return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
    }

    /**
     * 計算余弦相似度
     * @param context1 文本1
     * @param context2 文本2
     * @return 相似度
     */
    public double calculateCosSimilarity(String context1, String context2){
        return calculateCosSimilarity(participleNlp(context1).stream().collect(Collectors.groupingBy(o -> o, Collectors.summingInt(o -> 1))),
                participleNlp(context2).stream().collect(Collectors.groupingBy(o -> o, Collectors.summingInt(o -> 1))));
    }

具體實現(xiàn)看這里

mavaen 依賴

采用 ansj 5.1.6的版本

        <dependency>
            <groupId>org.ansj</groupId>
            <artifactId>ansj_seg</artifactId>
            <version>5.1.6</version>
        </dependency>

util 代碼如下

package cn.ideamake.business.tools.util;

import lombok.experimental.UtilityClass;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.NlpAnalysis;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author Barcke
 * @version 1.0
 * @projectName business-tools
 * @className TextPlagiarismCheckUtil
 * @date 2024/4/16 09:40
 * @slogan: 源于生活 高于生活
 * @description: 文本查重工具 分詞采用 ansj 分詞方法
 **/
@UtilityClass
public class TextPlagiarismCheckUtil {

    // 分詞方法 可替換?。。? start 
    
    /**
     * Nlp分詞方式
     * @param context 文本信息
     * @return 分詞后的list
     */
    public List<String> participleNlp(String context){
        return participleNlpToTerm(context).stream().map(Term::getName).collect(Collectors.toList());
    }

    /**
     * Nlp分詞方式
     * @param context 文本信息
     * @return 分詞后的Term
     */
    public List<Term> participleNlpToTerm(String context){
        return NlpAnalysis.parse(context).getTerms();
    }

    // 分詞方法 可替換?。?!  end

    /**
     * 計算余弦相似度
     * @param vec1 map1
     * @param vec2 map2
     * @return 相似度
     */
    public double calculateCosSimilarity(Map<String, Integer> vec1, Map<String, Integer> vec2) {
        double dotProduct = 0.0;
        double norm1 = 0.0;
        double norm2 = 0.0;
        for (Map.Entry<String, Integer> entry : vec1.entrySet()) {
            String word = entry.getKey();
            int count = entry.getValue();
            dotProduct += count * vec2.getOrDefault(word, 0);
            norm1 += Math.pow(count, 2);
        }
        for (Map.Entry<String, Integer> entry : vec2.entrySet()){
            int count = entry.getValue();
            norm2 += Math.pow(count, 2);
        }
        return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
    }

    /**
     * 計算余弦相似度
     * @param context1 文本1
     * @param context2 文本2
     * @return 相似度
     */
    public double calculateCosSimilarity(String context1, String context2){
        return calculateCosSimilarity(participleNlp(context1).stream().collect(Collectors.groupingBy(o -> o, Collectors.summingInt(o -> 1))),
                participleNlp(context2).stream().collect(Collectors.groupingBy(o -> o, Collectors.summingInt(o -> 1))));
    }

    /**
     * 判斷文本是否重復
     * @param context1 文本1
     * @param context2 文本2
     * @param threshold 閾值
     * @return 是否重復
     */
    public boolean ifPlagiarism(String context1, String context2, double threshold){
        return calculateCosSimilarity(context1, context2) > threshold;
    }

    /**
     * 判斷文本是否重復 默認閾值 0.7
     * @param context1 文本1
     * @param context2 文本2
     * @return 是否重復
     */
    public boolean ifPlagiarism(String context1, String context2){
        return ifPlagiarism(context1, context2, 0.7);
    }

}

使用案例

    public static void main(String[] args) {
        String str = "java實現(xiàn)論文查重,文本查重方案 采用 ansj 分詞法(barcke) -----" ;

        String str2 = "java實現(xiàn)論文查重,文本查重方案 采用 ansj 分詞法(barcke) -----" ;

	    String str3 = "java實現(xiàn)cke) -----" ;

        System.out.println("分詞數(shù)據(jù)(ansj分詞法):" + TextPlagiarismCheckUtil.participleNlp(str));

        System.out.println("重復率:" + TextPlagiarismCheckUtil.calculateCosSimilarity(str, str2) + "是否重復(默認閾值0.7):" + TextPlagiarismCheckUtil.ifPlagiarism(str, str2));

        System.out.println("重復率:" + TextPlagiarismCheckUtil.calculateCosSimilarity(str, str3) + "是否重復(默認閾值0.7):" + TextPlagiarismCheckUtil.ifPlagiarism(str, str3));
    }

執(zhí)行結果:

到此這篇關于Java實現(xiàn)文本查重的方法詳解的文章就介紹到這了,更多相關Java文本查重內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決java使用file.createNewFile()創(chuàng)建文件時報錯目錄不存在的問題

    解決java使用file.createNewFile()創(chuàng)建文件時報錯目錄不存在的問題

    這篇文章主要介紹了解決java使用file.createNewFile()創(chuàng)建文件時報錯目錄不存在的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Windows下RabbitMQ安裝及配置詳解

    Windows下RabbitMQ安裝及配置詳解

    本文主要介紹了Windows下RabbitMQ安裝及配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 淺談Redis在微服務架構中的幾種應用場景

    淺談Redis在微服務架構中的幾種應用場景

    本文介紹在SpringCloud中使用Redis作為Pub/Sub異步通信、緩存或主數(shù)據(jù)庫和配置服務器的三種場景應用。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java 發(fā)送http請求(get、post)的示例

    Java 發(fā)送http請求(get、post)的示例

    這篇文章主要介紹了Java 發(fā)送http請求的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • Spring?Boot?3中一套可以直接用于生產環(huán)境的Log4J2日志配置詳解

    Spring?Boot?3中一套可以直接用于生產環(huán)境的Log4J2日志配置詳解

    Log4J2是Apache Log4j的升級版,參考了logback的一些優(yōu)秀的設計,并且修復了一些問題,因此帶來了一些重大的提升,這篇文章主要介紹了Spring?Boot?3中一套可以直接用于生產環(huán)境的Log4J2日志配置,需要的朋友可以參考下
    2023-12-12
  • SpringBoot使用Caffeine實現(xiàn)內存緩存示例詳解

    SpringBoot使用Caffeine實現(xiàn)內存緩存示例詳解

    caffeine提供了四種緩存策略:分別為手動加載、自動加載、異步手動加載、異步自動加載,這篇文章主要介紹了SpringBoot使用Caffeine實現(xiàn)內存緩存,需要的朋友可以參考下
    2023-06-06
  • 如何使用IDEA查看java文件編譯后的字節(jié)碼內容

    如何使用IDEA查看java文件編譯后的字節(jié)碼內容

    這篇文章主要介紹了如何使用IDEA查看java文件編譯后的字節(jié)碼內容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談Java 代理機制

    淺談Java 代理機制

    Java 有兩種代理方式,一種是靜態(tài)代理,另一種是動態(tài)代理。如果我們在代碼編譯時就確定了被代理的類是哪一個,那么就可以直接使用靜態(tài)代理;如果不能確定,那么可以使用類的動態(tài)加載機制,在代碼運行期間加載被代理的類這就是動態(tài)代理
    2021-06-06
  • 詳解Servlet3.0新特性(從注解配置到websocket編程)

    詳解Servlet3.0新特性(從注解配置到websocket編程)

    Servlet3.0的出現(xiàn)是servlet史上最大的變革,其中的許多新特性大大的簡化了web應用的開發(fā),為廣大勞苦的程序員減輕了壓力,提高了web開發(fā)的效率。
    2017-04-04
  • Spring boot熱部署devtools過程解析

    Spring boot熱部署devtools過程解析

    這篇文章主要介紹了Spring boot熱部署devtools過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論

丹阳市| 海城市| 土默特左旗| 杭州市| 响水县| 眉山市| 朝阳区| 横山县| 平顶山市| 汶上县| 游戏| 泸定县| 启东市| 巫山县| 平定县| 吉林省| 桐梓县| 乌鲁木齐县| 垫江县| 桑日县| 察雅县| 斗六市| 宁河县| 大同市| 沅陵县| 枣庄市| 牡丹江市| 明水县| 东辽县| 浦北县| 天门市| 永定县| 绍兴市| 甘孜| 漠河县| 岗巴县| 石楼县| 武定县| 茌平县| 疏勒县| 乐陵市|