python jieba 文本相似度_文本相似度分析(基于jieba和gensim)
##基礎(chǔ)概念
本文在進(jìn)行文本相似度分析過程分為以下幾個部分進(jìn)行,
文本分詞
語料庫制作
算法訓(xùn)練
結(jié)果預(yù)測
分析過程主要用兩個包來實(shí)現(xiàn)jieba,gensim
jieba:主要實(shí)現(xiàn)分詞過程
gensim:進(jìn)行語料庫制作和算法訓(xùn)練
##結(jié)巴(jieba)分詞
在自然語言處理領(lǐng)域中,分詞和提取關(guān)鍵詞都是對文本處理時通常要進(jìn)行的步驟。用Python語言對英文文本進(jìn)行預(yù)處理時可選擇NLTK庫,中文文本預(yù)處理可選擇jieba庫。結(jié)巴分詞是基于統(tǒng)計(jì)的分詞方法,它對給出大量已經(jīng)分詞的文本,利用統(tǒng)計(jì)機(jī)器學(xué)習(xí)模型學(xué)習(xí)詞語切分的規(guī)律(稱為訓(xùn)練),從而實(shí)現(xiàn)對未知文本的切分。例如最大概率分詞方法和最大熵分詞方法等。隨著大規(guī)模語料庫的建立,統(tǒng)計(jì)機(jī)器學(xué)習(xí)方法的研究和發(fā)展,基于統(tǒng)計(jì)的中文分詞方法漸漸成為了主流方法。
###jieba分詞的三種模式:
* 精確模式:將句子最精確的分開,適合文本分析
* 全模式:句子中所有可以成詞的詞語都掃描出來,速度快,不能解決歧義
* 搜索引擎模式:在精確的基礎(chǔ)上,對長詞再次切分,提高召回
結(jié)巴分詞的其他特點(diǎn)諸如:支持繁體分詞,支持自定義詞典,基于Trie樹結(jié)構(gòu)實(shí)現(xiàn)高效的詞圖掃描,采用了動態(tài)規(guī)劃查找最大概率路徑等特點(diǎn)。
###jieba庫中分詞函數(shù)
1、jieba.cut()方法
參數(shù)string:需要接受分詞的字符串。
參數(shù)cut_all:控制是否采用全模式分詞發(fā),參數(shù)為True時表示采用全模式。
參數(shù)HMM:控制是否使用HMM模型,參數(shù)為True時表示使用HMM模型。
2、jieba.cut_for_search()
參數(shù)string:需要接受分詞的字符串。
參數(shù)HMM:控制是否使用HMM模型,參數(shù)為True時表示使用HMM模型。
jieba.cut 以及 jieba.cut_for_search 返回的結(jié)構(gòu)都是一個可迭代的 generator,可以使用 for 循環(huán)來獲得分詞后得到的每一個詞語。jieba.lcut和jieba.lcut_for_search參數(shù)和上面兩個方法一致但返回的是一個list。
###python上的分詞輸出對比
import jieba
string='上海市浦東新區(qū)世紀(jì)大道100號樓501'
#精準(zhǔn)模式
text_cut=jieba.cut(string)
print(" ".join(text_cut))
#全模式
text_cut=jieba.cut(string,cut_all=True)
print(" ".join(text_cut))
#搜索模式
text_cut=jieba.cut_for_search(string)
print(" ".join(text_cut))
三種模式的輸出結(jié)果:
精準(zhǔn)模式:上海市浦東新區(qū) 世紀(jì) 大道 100 號樓 501
全模式:上海 上海市 上海市浦東新區(qū) 海市 浦東 浦東新區(qū) 新區(qū) 世紀(jì) 紀(jì)大 大道 100 號 樓 501
搜索引擎模式:上海 海市 浦東 新區(qū) 上海市 上海市浦東新區(qū) 世紀(jì) 大道 100 號樓 501
###jieba分詞自定義字典
在使用jieba時,用戶除了直接對文本進(jìn)行分詞外,還可以自行添加新詞,已達(dá)到優(yōu)化分詞效果的目的。
1、加載自定義字典jieba.load_userdict()
參數(shù)filename:為文件類對象或自定義詞典的路徑
詞典格式分為3個部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。
file_name 若為路徑或二進(jìn)制方式打開的文件,則文件必須為 UTF-8 編碼。
2、從字典中添加或刪除詞匯add_word、del_word
add_word(word,freq=None,tag=None),add_word有3個參數(shù),添加詞名稱,詞頻,詞性
del_word(word),del_word只有一個參數(shù)詞語名稱
3、詞頻調(diào)整suggest_freq
suggest_freq(segment,tune=True)
調(diào)節(jié)單個詞語的詞頻,可以使其能(或不能)被分出來,詞頻越高在分詞時,能夠被分出來的概率越大。
###python示例
import jieba
#載入自定義詞典
jieba.load_userdict('word_dict.txt')
#查看用戶自定義詞典中的內(nèi)容
print(jieba.user_word_tag_tab)
#往自定義詞典中添加新詞
jieba.add_word('人民廣場',freq=5,tag='n')
#添加新詞后的結(jié)果
print(jieba.user_word_tag_tab)
string='上海市浦東新區(qū)世紀(jì)大道100號樓501'
text_cut=jieba.cut(string)
print(" ".join(text_cut))
#調(diào)整詞頻,重新分詞
jieba.suggest_freq(('上海市','浦東新區(qū)'),tune=True)
text_cut=jieba.cut(string)
print(" ".join(text_cut))
輸出結(jié)果:
載入詞典內(nèi)容:{'世紀(jì)大道': 'n', '浦東新區(qū) 2 ': 'n', '世紀(jì)公園 3 ': 'n'}
添加新詞后:{'世紀(jì)大道': 'n', '浦東新區(qū) 2 ': 'n', '世紀(jì)公園 3 ': 'n', '人民廣場': 'n'}
結(jié)巴原始字典庫,分詞結(jié)果:上海市浦東新區(qū) 世紀(jì) 大道 100 號樓 501
使用自定義詞典后,分詞結(jié)果:上海市浦東新區(qū) 世紀(jì)大道 100 號樓 501
調(diào)整詞頻后,分詞結(jié)果:上海市 浦東新區(qū) 世紀(jì)大道 100 號樓 501
結(jié)巴分詞官方文檔:
https://pypi.org/project/jieba/
##Gensim
Gensim是一款開源的第三方Python工具包,用于從原始的非結(jié)構(gòu)化的文本中,無監(jiān)督地學(xué)習(xí)到文本隱層的主題向量表達(dá)。
它支持包括TF-IDF,LSA,LDA,和word2vec在內(nèi)的多種主題模型算法。
###相關(guān)概念
語料(Corpus):一組原始文本的集合,用于無監(jiān)督地訓(xùn)練文本主題的隱層結(jié)構(gòu)。在Gensim中,Corpus通常是一個可迭代的對象(比如列表)。每一次迭代返回一個可用于表達(dá)文本對象的稀疏向量。
向量(Vector):由一組文本特征構(gòu)成的列表。是一段文本在Gensim中的內(nèi)部表達(dá)。在向量空間模型中,每個文檔被表示成了一組特征,比如,一個單一的特征可能被視為一個問答對。
稀疏向量(SparseVector):通常,大部分問題的答案都是0,為了節(jié)約空間,我們會從文檔表示中省略他們,向量中的每一個元素是一個(key, value)的元組,比如(1,3),(2,4),(5,0),其中(5,0)是一個稀疏向量,在表示是會被忽略。
模型(Model):是一個抽象的術(shù)語。定義了兩個向量空間的變換(即從文本的一種向量表達(dá)變換為另一種向量表達(dá))。
把幾個概念組織起來表述:gensim可以通過讀取一段語料,輸出一個向量,表示文檔中的一個詞。為了節(jié)約空間,通常稀疏的詞向量會被忽略,剩下的詞向量則可以用來訓(xùn)練各種模型,即從原有的文本表達(dá)轉(zhuǎn)向另一種文本表達(dá)。
###語料庫制作
語料庫制作主要包含兩個過程:
獲取詞袋:本文主要來自于結(jié)巴分詞結(jié)果
向量轉(zhuǎn)換:對獲取的詞袋進(jìn)行向量轉(zhuǎn)換
1、獲取詞袋函數(shù) gensim.corpora.Dictionary()
gensim.corpora.dictionary.Dictionary可以為每個出現(xiàn)在語料庫中的單詞分配了一個獨(dú)一無二的整數(shù)編號id。這個操作收集了單詞計(jì)數(shù)及其他相關(guān)的統(tǒng)計(jì)信息。
###python示例
import jieba
import gensim
print(jieba.user_word_tag_tab)
string=['上海市浦東新區(qū)世紀(jì)大道100號樓501','上海市世紀(jì)大道100號樓501']
texts_list=[]
for sentence in string:
sentence_list=[ word for word in jieba.cut(sentence)]
texts_list.append(sentence_list)
dictionary=gensim.corpora.Dictionary(texts_list)
print(dictionary)
print(dictionary.token2id)
輸出結(jié)果:
Dictionary(7 unique tokens: ['100', '501', '上海市浦東新區(qū)', '世紀(jì)', '號樓']...)
{'100': 0, '501': 1, '上海市浦東新區(qū)': 2, '世紀(jì)': 3, '號樓': 4, '大道': 5, '上海市': 6}
第一行結(jié)果告訴我們語料庫中有7個不同的單詞,這表明每個文檔將會用7個數(shù)字表示(即7維向量)。
第二行結(jié)果是查看單詞與編號之間的映射關(guān)系。
2、向量轉(zhuǎn)換 dictionary.doc2bow()
函數(shù)doc2bow() 簡單地對每個不同單詞的出現(xiàn)次數(shù)進(jìn)行了計(jì)數(shù),并將單詞轉(zhuǎn)換為其編號,然后以稀疏向量的形式返回結(jié)果。
###python示例
corpus = [dictionary.doc2bow(doc) for doc in texts_list]
print(corpus)
輸出結(jié)果:
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)], [(0, 1), (1, 1), (3, 1), (4, 1), (5, 1), (6, 1)]]
以上結(jié)果中,表示兩個字符串中,每個詞的id以及它對應(yīng)的出現(xiàn)頻次,比如第一個元組(0,1)代表的是編號為0的詞在第一個字符串中出現(xiàn)一次。
###算法訓(xùn)練
下面我們使用tf-idf算法對上面的語料庫進(jìn)行建模,識別不同文本的相似度。
###python示例
#測試字符串
test_string='浦東新區(qū)世紀(jì)大道100號樓501'
test_doc_list=[word for word in jieba.cut(test_string)]
test_doc_vec=dictionary.doc2bow(test_doc_list)
# 使用TF-IDF模型對語料庫建模
tfidf = gensim.models.TfidfModel(corpus)
#分析測試文檔與已存在的每個訓(xùn)練文本的相似度
index = gensim.similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys()))
sim = index[tfidf[test_doc_vec]]
print(sim)
輸出結(jié)果:
[ 0.63650501 0.63650501 0. ]
表示測試文本與訓(xùn)練的3個文本相似度分布0.63 0.63 0
以上就是使用jieba和gensim文本相似度的簡單實(shí)現(xiàn).
gensim官方文檔:
https://pypi.org/project/gensim/
【Pyhton 數(shù)據(jù)分析】通過gensim進(jìn)行文本相似度分析
環(huán)境描述 Python環(huán)境:Python 3.6.1 系統(tǒng)版本:windows7 64bit 文件描述 一共有三個文件,分別是:file_01.txt.file_02.txt.file_03.txt ...
文本離散表示(三):TF-IDF結(jié)合n-gram進(jìn)行關(guān)鍵詞提取和文本相似度分析
這是文本離散表示的第二篇實(shí)戰(zhàn)文章,要做的是運(yùn)用TF-IDF算法結(jié)合n-gram,求幾篇文檔的TF-IDF矩陣,然后提取出各篇文檔的關(guān)鍵詞,并計(jì)算各篇文檔之間的余弦距離,分析其相似度. TF-IDF與n ...
python 用gensim進(jìn)行文本相似度分析
http://blog.csdn.net/chencheng126/article/details/50070021 參考于這個博主的博文. 原理 1.文本相似度計(jì)算的需求始于搜索引擎. 搜索引擎需要 ...
基于python語言使用余弦相似性算法進(jìn)行文本相似度分析
編寫此腳本的目的: 本人從事軟件測試工作,近兩年發(fā)現(xiàn)項(xiàng)目成員總會提出一些內(nèi)容相似的問題,導(dǎo)致開發(fā)抱怨.一開始想搜索一下是否有此類工具能支持查重的工作,但并沒找到,因此寫了這個工具.通過從紙上談兵到著手 ...
Python 文本相似度分析
環(huán)境 Anaconda3 Python 3.6, Window 64bit 目的 利用 jieba 進(jìn)行分詞,關(guān)鍵詞提取 利用gensim下面的corpora,models,similarities ...
TF-IDF 文本相似度分析
前陣子做了一些IT opreation analysis的research,從產(chǎn)線上取了一些J2EE server運(yùn)行狀態(tài)的數(shù)據(jù)(CPU,Menory...),打算通過訓(xùn)練JVM的數(shù)據(jù)來建立分類模型, ...
LSTM 句子相似度分析
使用句子中出現(xiàn)單詞的Vector加權(quán)平均進(jìn)行文本相似度分析雖然簡單,但也有比較明顯的缺點(diǎn):沒有考慮詞序且詞向量區(qū)別不明確.如下面兩個句子: "北京的首都是中國"與"中國的 ...
gensim和jieba分詞進(jìn)行主題分析,文本相似度
參考鏈接:https://blog.csdn.net/whzhcahzxh/article/details/17528261 demo1:結(jié)巴分詞: # 構(gòu)造分詞庫,格式如下: ''' [['樓下', ...
python 全棧開發(fā),Day133(玩具與玩具之間的對話,基于jieba gensim pypinyin實(shí)現(xiàn)的自然語言處理,打包apk)
先下載github代碼,下面的操作,都是基于這個版本來的! https://github.com/987334176/Intelligent_toy/archive/v1.6.zip 注意:由于涉及到 ...
隨機(jī)推薦
用jsch.jar實(shí)現(xiàn)SFTP上傳下載刪除
java類: 需要引用的jar: jsch-0.1.53.jar 關(guān)于jsch有篇文章關(guān)于目錄的問題寫得非常好:http://www.zzzyk.com/show/9f02969327434a6c.h ...
uva 125
floyd 算法 ? 如果存在無數(shù)條路 ?則存在a->a的路 ?a->b的路徑數(shù)等于 a->i 和?i->b(0=
ng-class css樣式
< ...
浙江大學(xué)PAT上機(jī)題解析之3-04. 一元多項(xiàng)式的乘法與加法運(yùn)算
設(shè)計(jì)函數(shù)分別求兩個一元多項(xiàng)式的乘積與和. 輸入格式說明: 輸入分2行,每行分別先給出多項(xiàng)式非零項(xiàng)的個數(shù),再以指數(shù)遞降方式輸入一個多項(xiàng)式非零項(xiàng)系數(shù)和指數(shù)(絕對值均為不超過1000的整數(shù)).數(shù)字間以空格分 ...
深入Java虛擬機(jī)(1)——Java體系結(jié)構(gòu)
Java體系結(jié)構(gòu) Java體系結(jié)構(gòu)包括四個獨(dú)立但相關(guān)的技術(shù): 1.Java程序設(shè)計(jì)語言 2.Java class文件格式 3.Java應(yīng)用編程接口(API) 4.Java虛擬機(jī) 當(dāng)編寫并運(yùn)行一個Jav ...
windows虛擬內(nèi)存機(jī)制
在windows系統(tǒng)中個,每個進(jìn)程擁有自己獨(dú)立的虛擬地址空間(Virtual Address Space).這一地址空間的大小與計(jì)算機(jī)硬件.操作系統(tǒng)以及應(yīng)用程序都有關(guān)系. 對于32位程序來說,最多能使 ...
十三、MUI的日期起始和結(jié)束日期設(shè)置
MUI的日期選擇器的使用 // 日期選擇器 //生日選擇器(不會超過今年) function fdPicker1(id) { var year=new Date().getFullYear(); va ...
C#自繪蒙版控件,帶延時隱藏顯示,拷貝底圖功能
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...
白化(Whitening): PCA 與 ZCA (轉(zhuǎn))
轉(zhuǎn)自:findbill 本文討論白化(Whitening),以及白化與 PCA(Principal Component Analysis) 和 ZCA(Zero-phase Component Ana ...
Python學(xué)習(xí)系列之(二)圖解Windows8.1下安裝Django
一. 下載?去官網(wǎng)下載https://www.djangoproject.com/download/最新版,最新版本是1.6 二. 安裝:?將下載下來的Django-1.6.tar.gz解壓到D盤,接 ...
總結(jié)
以上是生活随笔為你收集整理的python jieba 文本相似度_文本相似度分析(基于jieba和gensim)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《电脑报》:中国“人肉搜索第一案”幕后之
- 下一篇: python展示_python展示ppt