知识分享·NLP中一些有趣的trick

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)
    # 转化为TF矩阵
    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)
    # 转化为TF矩阵
    cv = CountVectorizer(tokenizer=lambda s: s.split())
    corpus = [s1, s2]
    vectors = cv.fit_transform(corpus).toarray()
    # 计算TF系数
    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)
    # 转化为TF-IDF矩阵
    cv = TfidfVectorizer(tokenizer=lambda s: s.split())
    corpus = [s1, s2]
    vectors = cv.fit_transform(corpus).toarray()
    print(vectors)
    # 计算TF-IDF系数
    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%
簇群关键词:
 图片, 上海, 宝宝, 做法, 功效, 价格, 意思, 作用, 汽车, 手机, 北京, 信用卡, 视频, 苹果, 症状, 有限公司, 招聘, 中国, 查询, 广州, 公交车, 时间, 深圳, 官网, 电视剧, 医院, 快递, 郑州, 梦见, 路线, 西安, 原因, 月经, 杭州, 时刻表, 公司, 广场, 电话, 微信, 怀孕, 区别, 电影, 婴儿, 报价, 厦门, 火车, 下载, 小说, 治疗, 倾城, 方法, 星座, 机场, 时候, 品牌, 南京, 摩托车, 韩国, 华为, 地铁, 新生儿, 直播, 孕妇, 济南, 月饼, 银行, 眼睛, 牌子, 照片, 面膜, 集团, 个人资料, 不能, 歌词, 科技, 需要, 适合, 常州, 淘宝, 好吃,
------------------------------------------------------------------------------------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值