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