文本相似度判斷

今天開(kāi)源社區(qū)技術(shù)小伙伴問(wèn)到敏弃,如何判斷2個(gè)論文或者文章相似度。然后隨便了解了一下匠璧,記一下筆記

文章相似度對(duì)比屬于NLP(自然語(yǔ)言處理)入門(mén)基礎(chǔ)知識(shí)芽狗,涉及到的算法和思路如下

思路

1. 分詞

即將兩篇文章中涉及到的句子拆分為單詞或詞組

2. 清洗

將獲得的單詞狡蝶,詞組去掉停用詞 (停用詞比如符號(hào)庶橱,嗎,呀贪惹,的)等沒(méi)有意義的字或者詞

3. 計(jì)算權(quán)重

通過(guò)清洗完成后的詞苏章,計(jì)算詞在文章中出現(xiàn)的比重,即比重越高奏瞬,則表示該詞出現(xiàn)的頻率越高

4. 計(jì)算相似度

有了2遍文章各自詞的權(quán)重后枫绅,通過(guò)余弦相似度算法計(jì)算相似度

算法

涉及到的算法有如下

1. 分詞算法

分詞算法采用的是jieba分詞,將句子分為單詞

2. 計(jì)算權(quán)重

權(quán)重算法采用TF-IDF

TF-IDF是一種用于資訊檢索與文本挖掘的常用加權(quán)技術(shù)硼端,主要思想:如果一個(gè)單詞在該文章中出現(xiàn)的頻率(TF)高并淋,并且在其它文章中出現(xiàn)頻率很低,則認(rèn)為該單詞具有很好的區(qū)分能力珍昨,適合用來(lái)進(jìn)行分類(lèi)县耽。

詞頻(Term Frequency)表示單詞在該文章中出現(xiàn)的頻率。

詞頻(TF) = 單詞在該文章出現(xiàn)次數(shù)/當(dāng)前文章總單詞數(shù)


詞頻(TF)
反問(wèn)檔頻率(Inverse Document Frequency)表示某一個(gè)特定單詞IDF可以由總文章數(shù)除以包含該單詞的文章數(shù)镣典,再將得到的商取對(duì)數(shù)得到兔毙。如果包含該單詞的文章越少,則IDF越大兄春,則表明該單詞具有很好的文章區(qū)分能力澎剥。

反問(wèn)檔頻率(IDF) = log(語(yǔ)料庫(kù)中文章總數(shù)/(包含該單詞的文章數(shù)+1))
在這里插入圖片描述


IDF

TF-IDF與一個(gè)詞在文檔中的出現(xiàn)次數(shù)成正比, 與包含該詞的文檔數(shù)成反比赶舆。

有了IDF的定義哑姚,我們就可以計(jì)算某一個(gè)詞語(yǔ)的TF-IDF值:
TF-IDF(x)=TF(x)*IDF(x),其中TF(x)指單詞x在當(dāng)前文章中的詞頻。
在這里插入圖片描述


TF-IDF

TF-IDF算法的優(yōu)點(diǎn):簡(jiǎn)單快速芜茵,結(jié)果比較符合實(shí)際情況叙量。
TF-IDF算法的缺點(diǎn):?jiǎn)渭円?詞頻"衡量一個(gè)詞的重要性,不夠全面夕晓,有時(shí)重要的詞可能出現(xiàn)次數(shù)并不多宛乃。而且悠咱,這種算法無(wú)法體現(xiàn)詞的位置信息蒸辆,出現(xiàn)位置靠前的詞與出現(xiàn)位置靠后的詞征炼,都被視為重要性相同,這是不正確的躬贡。(一種解決方法是谆奥,對(duì)全文的第一段和每一段的第一句話(huà),給予較大的權(quán)重拂玻。)
TF-IDF的應(yīng)用場(chǎng)景:TF-IDF算法可用來(lái)提取文檔的關(guān)鍵詞酸些,關(guān)鍵詞在文本聚類(lèi)、文本分類(lèi)檐蚜、文獻(xiàn)檢索魄懂、自動(dòng)文摘等方面有著重要應(yīng)用。

2. 相似度算法

余弦相似性通過(guò)測(cè)量?jī)蓚€(gè)向量的夾角的余弦值來(lái)度量它們之間的相似性闯第。
相似性范圍從-1到1:

  • -1意味著兩個(gè)向量指向的方向正好截然相反
  • 1表示它們的指向是完全相同的
  • 0通常表示它們之間是獨(dú)立的市栗,而在這之間的值則表示中間的相似性或相異性。

最常見(jiàn)的應(yīng)用就是計(jì)算文本相似度

測(cè)試代碼如下

# encoding=utf-8
import jieba
from scipy import spatial
from sklearn.feature_extraction.text import TfidfVectorizer

def cut(txt_name1, txt_name2):
    with open(txt_name1, encoding = 'utf-8') as f1:  # 以只讀方式打開(kāi)文件
        txt = f1.read()
        txt_encode = txt.encode('utf-8')
        txt_cut = jieba.cut(txt_encode)  # 切詞
        result = ' '.join(txt_cut)
        # print(result)
    with open(txt_name2, "w",encoding="utf-8") as f2:  # 分詞結(jié)果寫(xiě)入文件保存
        f2.write(result)
    f1.close()
    f2.close()


cut(r"D:\python\test\nlp_test00.txt", r"D:\python\test\nlp_test0_0.txt")  # 分別對(duì)文件調(diào)用cut方法分詞
cut(r"D:\python\test\nlp_test11.txt", r"D:\python\test\nlp_test1_1.txt")

# 將停用詞表從文件讀出咳短,并切分成一個(gè)數(shù)組備用
stopWords_dic = open(r'D:\python\test\chineseStopWords.txt', encoding='utf-8')  # 從文件中讀入停用詞
stopWords_content = stopWords_dic.read()
stopWords_list = stopWords_content.splitlines()  # 轉(zhuǎn)為list備用
stopWords_dic.close()

with open(r"D:\python\test\nlp_test0_0.txt",  encoding='utf-8') as f3:
    res3 = f3.read()
with open(r"D:\python\test\nlp_test1_1.txt", encoding='utf-8') as f4:
    res4 = f4.read()

corpus = [res3, res4]
# print(corpus)
vector = TfidfVectorizer(stop_words=stopWords_list)
tf_idf = vector.fit_transform(corpus)
# print(tf_idf)

word_list = vector.get_feature_names_out()  # 獲取詞袋模型的所有詞
weight_list = tf_idf.toarray()

# 打印每類(lèi)文本的tf-idf詞語(yǔ)權(quán)重填帽,第一個(gè)for遍歷所有文本,第二個(gè)for便利某一類(lèi)文本下的詞語(yǔ)權(quán)重
for i in range(len(weight_list)):
    print("-------第", i + 1, "段文本的詞語(yǔ)tf-idf權(quán)重------")
    for j in range(len(word_list)):
        print(word_list[j], weight_list[i][j])

# 采用余弦相似度算法
def cosine_cal(v1, v2):
    cos_sim = 1 - spatial.distance.cosine(v1, v2)
    return cos_sim

## 判斷2個(gè)tf-idf詞語(yǔ)權(quán)重相似度
result= cosine_cal(weight_list[0],weight_list[1])
#相似度0到1之間
print(result)

chineseStopWords.txt 是停用詞文檔
nlp_test00.txt和nlp_test11.txt 分別是需要判刑的文章

運(yùn)行結(jié)果如圖 result 則是文本相似度

1686292660919.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咙好,一起剝皮案震驚了整個(gè)濱河市篡腌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勾效,老刑警劉巖嘹悼,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異葵第,居然都是意外死亡绘迁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)卒密,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缀台,“玉大人,你說(shuō)我怎么就攤上這事哮奇√鸥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鼎俘,是天一觀的道長(zhǎng)哲身。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贸伐,這世上最難降的妖魔是什么勘天? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上脯丝,老公的妹妹穿的比我還像新娘商膊。我一直安慰自己,他們只是感情好宠进,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布晕拆。 她就那樣靜靜地躺著,像睡著了一般材蹬。 火紅的嫁衣襯著肌膚如雪实幕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天堤器,我揣著相機(jī)與錄音昆庇,去河邊找鬼。 笑死闸溃,一個(gè)胖子當(dāng)著我的面吹牛凰锡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圈暗,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掂为,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了员串?” 一聲冷哼從身側(cè)響起勇哗,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寸齐,沒(méi)想到半個(gè)月后欲诺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渺鹦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年扰法,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅厚。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塞颁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吸耿,到底是詐尸還是另有隱情祠锣,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布咽安,位于F島的核電站伴网,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏妆棒。R本人自食惡果不足惜澡腾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一沸伏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧动分,春花似錦馋评、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纠脾。三九已至玛瘸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苟蹈,已是汗流浹背糊渊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慧脱,地道東北人渺绒。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像菱鸥,于是被迫代替她去往敵國(guó)和親宗兼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容