1、计算文本相似度
1.1 编辑距离
import distance
def edit_distance ( s1, s2) :
return distance. levenshtein( s1, s2)
strings = [
'你在干什么' ,
'你在干啥子' ,
'你在做什么' ,
'你好啊' ,
'我喜欢吃香蕉'
]
target = '你在干啥'
results = list ( filter ( lambda x: edit_distance( x, target) <= 2 , strings) )
print ( results)
1.2 杰卡德系数(Jaccard 相似系数)
from sklearn. feature_extraction. text import CountVectorizer
import numpy as np
def jaccard_similarity ( s1, s2) :
def add_space ( s) :
return ' ' . join( list ( s) )
s1, s2 = add_space( s1) , add_space( s2)
cv = CountVectorizer( tokenizer= lambda s: s. split( ) )
corpus = [ s1, s2]
vectors = cv. fit_transform( corpus) . toarray( )
numerator = np. sum ( np. min ( vectors, axis= 0 ) )
denominator = np. sum ( np. max ( vectors, axis= 0 ) )
return 1.0 * numerator / denominator
s1 = '你在干嘛呢'
s2 = '你在干什么呢'
print ( jaccard_similarity( s1, s2) )
1.3 词频统计
from sklearn. feature_extraction. text import CountVectorizer
import numpy as np
from scipy. linalg import norm
def tf_similarity ( s1, s2) :
def add_space ( s) :
return ' ' . join( list ( s) )
s1, s2 = add_space( s1) , add_space( s2)
cv = CountVectorizer( tokenizer= lambda s: s. split( ) )
corpus = [ s1, s2]
vectors = cv. fit_transform( corpus) . toarray( )
return np. dot( vectors[ 0 ] , vectors[ 1 ] ) / ( norm( vectors[ 0 ] ) * norm( vectors[ 1 ] ) )
s1 = '你在干嘛呢'
s2 = '你在干什么呢'
print ( tf_similarity( s1, s2) )
1.4 余弦相似度
from sklearn. feature_extraction. text import TfidfVectorizer
import numpy as np
from scipy. linalg import norm
def tfidf_similarity ( s1, s2) :
def add_space ( s) :
return ' ' . join( list ( s) )
s1, s2 = add_space( s1) , add_space( s2)
cv = TfidfVectorizer( tokenizer= lambda s: s. split( ) )
corpus = [ s1, s2]
vectors = cv. fit_transform( corpus) . toarray( )
print ( vectors)
return np. dot( vectors[ 0 ] , vectors[ 1 ] ) / ( norm( vectors[ 0 ] ) * norm( vectors[ 1 ] ) )
s1 = '你在干嘛呢'
s2 = '你在干什么呢'
print ( tfidf_similarity( s1, s2) )
1.5 Word2Vec
import gensim
import jieba
import numpy as np
from scipy. linalg import norm
model_file = './word2vec/news_12g_baidubaike_20g_novel_90g_embedding_64.bin'
model = gensim. models. KeyedVectors. load_word2vec_format( model_file, binary= True )
def vector_similarity ( s1, s2) :
def sentence_vector ( s) :
words = jieba. lcut( s)
v = np. zeros( 64 )
for word in words:
v += model[ word]
v /= len ( words)
return v
v1, v2 = sentence_vector( s1) , sentence_vector( s2)
return np. dot( v1, v2) / ( norm( v1) * norm( v2) )
s1 = '你在干嘛'
s2 = '你正做什么'
print ( vector_similarity( s1, s2) )
strings = [
'你在干什么' ,
'你在干啥子' ,
'你在做什么' ,
'你好啊' ,
'我喜欢吃香蕉'
]
target = '你在干啥'
for string in strings:
print ( string, vector_similarity( string, target) )
2、LDA
texts = [
[ '苹果' , '叶子' , '椭圆形' , '树上' ] ,
[ '植物' , '叶子' , '绿色' , '落叶乔木' ] ,
[ '水果' , '苹果' , '红彤彤' , '味道' ] ,
[ '苹果' , '落叶乔木' , '树上' , '水果' ] ,
[ '植物' , '营养' , '水果' , '维生素' ] ,
[ '营养' , '维生素' , '苹果' , '成分' ] ,
[ '互联网' , '电脑' , '智能手机' , '高科技' ] ,
[ '苹果' , '公司' , '互联网' , '品质' ] ,
[ '乔布斯' , '苹果' , '硅谷' ] ,
[ '电脑' , '智能手机' , '苹果' , '乔布斯' ] ,
[ '苹果' , '电脑' , '品质' , '生意' ] ,
[ '电脑' , '品质' , '乔布斯' ] ,
[ '苹果' , '公司' , '生意' , '硅谷' ]
]
dictionary = Dictionary( texts)
corpus = [ dictionary. doc2bow( text) for text in texts]
model = models. ldamodel. LdaModel( corpus, id2word= dictionary, num_topics= 2 )
topic_list = [ '水果' , '公司' ]
all_topics = model. get_document_topics( corpus, per_word_topics= True )
cnt = 0
for doc_topics in all_topics:
print ( '新文档:{} \n' . format ( cnt) , texts[ cnt] )
doc_topics = [ ( topic_list[ i[ 0 ] ] , i[ 1 ] ) for i in doc_topics]
print ( '文档主题:' , doc_topics)
print ( ' ' )
print ( '-------------- \n' )
cnt+= 1
新文档: 0
[ '苹果' , '叶子' , '椭圆形' , '树上' ]
文档主题: [ ( '水果' , 0.8769770939380782 ) , ( '公司' , 0.12302290606192186 ) ]
3、文本聚类
km = KMeans( n_clusters= 4 , init= 'k-means++' , random_state= 0 )
label_prediction = km. predict( X)
label_prediction = list ( label_prediction)
print ( "每个聚类的TOP关键词:" )
order_centroids = km. cluster_centers_. argsort( ) [ : , : : - 1 ]
terms = vectorizer. get_feature_names( )
for i in range ( 4 ) :
print ( "簇群 %d " % ( i+ 1 ) , end= '' )
print ( "该簇群所含文档占比为" , '%.4f%%' % ( int ( label_prediction. count( i) ) / int ( len ( df[ 'words' ] ) ) ) )
print ( "簇群关键词:" )
for ind in order_centroids[ i, : 80 ] :
print ( ' %s,' % terms[ ind] , end= '' )
print ( '\n------------------------------------------------------------------------------------------------' )
每个聚类的TOP关键词:
簇群 1 该簇群所含文档占比为 0.2310 %
簇群关键词:
手机, 荣耀, 王者, 图片, 下载, 视频, 世界, 游戏, 英雄, 百度, 电影, 电脑, 头像, 联盟, 皮肤, 软件, 意思, 漫画, 笔记本, 微信, 动漫, 小说, 男生, 直播, 手游, 苹果, 作战, 全集, 奥特曼, 小米, 官网, 密码, 少女, 破解版, 网名, 球球, 名字, 华为, 希尔, 会员, 助手, 设置, 观看, 本子, 安卓, 电视剧, 资源, 魅族, 先锋, 腾讯, 女生, 攻略, 纹身, 福利, 系统, 路由器, 耳机, 生活, 中国, 歌曲, 宽带, 移动, 连接, 歌词, 显卡, 守望, 三星, 影院, 战争, 时候, 照片, 淘宝, 账号, 不能, 部落, 客服, 演员表, 蓝牙, 升级, 查询,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
簇群 2 该簇群所含文档占比为 0.1050 %
簇群关键词:
小说, 重生, 怀孕, 穿越, 总裁, 书包, 全文, 阅读, 都市, 男主, 女主, 洪荒, 倾城, 下载, 类似, 老公, 孕妇, 系统, 网游, 王爷, 免费, 王妃, 末世, 后宫, 极品, 豪门, 漫画, 胎儿, 皇后, 宝宝, 红楼, 排卵, 图片, 电影, 宠文, 世界, 会计, 风流, 电视剧, 意思, 老婆, 宝贝, 手机, 霸道, 神医, 妖孽, 绝色, 美文, 结局, 男孩, 孕酮, 游戏, 无限, 修仙, 异界, 公主, 动漫, 火影, 特工, 完结, 军婚, 月经, 胎心, 公子, 子宫, 妈咪, 美女, 格林童话, 炮灰, 百度, 全集, 绝世, 小姐, 养成, 闪婚, 主叫, 娱乐圈, 修真, 白带, 杀手,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
簇群 3 该簇群所含文档占比为 0.3290 %
簇群关键词:
意思, 英语, 作文, 图片, 中国, 英文, 大学, 翻译, 读音, 手机, 成语, 学院, 答案, 视频, 倾城, 歌词, 句子, 下载, 电影, 小说, 上册, 组词, 北京, 时间, 软件, 头像, 开头, 天津, 歌曲, 世界, 百度, 电视剧, 女生, 描写, 直播, 查询, 表情, 赵丽颖, 高考, 成都, 数学, 时候, 游戏, 拼音, 官网, 杨洋, 照片, 词语, 阅读, 学校, 王宝强, 乔任梁, 近义词, 故事, 快递, 考试, 漫画, 工作, 老师, 马蓉, 微信, 上海, 职业, 小学, 教育, 开学, 个人资料, 荣耀, 合肥, 中学, 区别, 不能, 南昌, 内容, 学生, 苹果, 免费, 英雄, 淘宝, 阴阳师,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
簇群 4 该簇群所含文档占比为 0.3350 %
簇群关键词:
图片, 上海, 宝宝, 做法, 功效, 价格, 意思, 作用, 汽车, 手机, 北京, 信用卡, 视频, 苹果, 症状, 有限公司, 招聘, 中国, 查询, 广州, 公交车, 时间, 深圳, 官网, 电视剧, 医院, 快递, 郑州, 梦见, 路线, 西安, 原因, 月经, 杭州, 时刻表, 公司, 广场, 电话, 微信, 怀孕, 区别, 电影, 婴儿, 报价, 厦门, 火车, 下载, 小说, 治疗, 倾城, 方法, 星座, 机场, 时候, 品牌, 南京, 摩托车, 韩国, 华为, 地铁, 新生儿, 直播, 孕妇, 济南, 月饼, 银行, 眼睛, 牌子, 照片, 面膜, 集团, 个人资料, 不能, 歌词, 科技, 需要, 适合, 常州, 淘宝, 好吃,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -