文本处理以及求相似度

常规操作。先读取文档
在这里插入图片描述

## 1. 分词 , 清洗关键词, 
#     # 删除  特殊字符 
#     PATTERN = r'[?|$|&|*|%|@|(|)|~]'
#     text = re.sub(PATTERN, r'', text)


# string manipulation libs
import re
import string
import nltk
from nltk.corpus import stopwords


def cleaning_text(text: str,  ) -> str:
    # remove special chars and numbers #  删除 特殊字符 和数字  
    text = re.sub("[^A-Za-z]+", " ", text)
    # remove stopwords
    # 1. tokenize
    tokens = nltk.word_tokenize(text)
    # 2. check if stopword
    tokens = [w for w in tokens if not w.lower() in stopwords.words("english")]
    # 3. join back together
    text = " ".join(tokens)
    # return text in lower case and stripped of whitespaces
    text = text.lower().strip()
    return text
df_wd['cleaned'] = df_wd['words'].apply(lambda x: cleaning_text(x))

稀疏矩阵

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(sublinear_tf=True, min_df=5, max_df=0.95)
# fit_transform applies TF-IDF to clean texts - we save the array of vectors in X
X = vectorizer.fit_transform( df_wd['cleaned'].tolist() )
vectorizer.get_feature_names_out()

在这里插入图片描述
在这里插入图片描述

相似度对比:

余弦相似度

在这里插入图片描述

# Let's import text feature extraction TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
docs=['I love pets.','I hate pets.']

# Initialize TfidfVectorizer object
tfidf= TfidfVectorizer()

# Fit and transform the given data
tfidf_vector = tfidf.fit_transform(docs)

# Import cosine_similarity metrics
from sklearn.metrics.pairwise import cosine_similarity

# compute similarity using cosine similarity
cos_sim=cosine_similarity(tfidf_vector, tfidf_vector)

print(cos_sim)

使用余弦相似度需要 词向量
在这里插入图片描述

jaccard 相似度,求的是 相同单词的交集 涉及到单复数等问题

直接求 句子的相似度

def jaccard_similarity(sent1, sent2):
    """Find text similarity using jaccard similarity"""
    # Tokenize sentences
    token1 = set(sent1.split())
    token2 = set(sent2.split())
     
    # intersection between tokens of two sentences    
    intersection_tokens = token1.intersection(token2)
    
    # Union between tokens of two sentences
    union_tokens=token1.union(token2)
    
    # Cosine Similarity
    sim_= float(len(intersection_tokens) / len(union_tokens))
    return sim_

jaccard_similarity('I love pets.','I hate pets.')

也就是说,在处理文本数据时很少使用 Jaccard 相似度,因为它不适用于文本嵌入。这意味着仅限于评估文本的词汇相似性,即文档在单词级别上的相似程度。

就余弦和欧几里德度量而言,两者之间的区别因素是余弦相似度不受特征向量的大小/长度的影响。假设我们正在创建一个主题标记算法。如果一个词(例如 senate)在文档 1 中比在文档 2 中出现的频率更高,我们可以假设文档 1 与政治主题的相关性更高。但是,也可能是我们正在处理不同长度的新闻文章。然后,“参议院”一词可能在文件 1 中出现得更多,仅仅是因为它更长。正如我们之前在重复“空”这个词时看到的那样,余弦相似度对长度差异不太敏感。

除此之外,欧氏距离不适用于文本嵌入的稀疏向量。因此,在处理文本数据时,余弦相似度通常优于欧氏距离。想到的唯一对长度敏感的文本相似性用例是剽窃检测。

最重要的 参考链接 进行理解、

理解链接:

  1. 文本规范化 做关键预处理
    https://wiki.shileizcc.com/confluence/pages/viewpage.action?pageId=42533117

  2. 文本相似度
    https://subscription.packtpub.com/book/data/9781789955248/16/ch16lvl1sec65/text-similarity

  3. 黑马 文本处理
    https://book.itheima.net/course/221/1270308811000782849/1271374300858818562

  4. 学习NLP
    https://github.com/jevy146/66Days__NaturalLanguageProcessing
    5.英文句子相似性判断 比较完整
    https://www.cnblogs.com/infaraway/p/8666269.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43351935

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值