python进行文本分析

python
文本处理
python进行文本处理的操作:相似度计算、信息抽取、分词等
作者

不止BI

发布于

2024年3月15日

文本相似度

安装

代码
# 安装torch及simisimilarities
# !pip3 install -U similarities
# !pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
import torch
from similarities import BertSimilarity
m = BertSimilarity(model_name_or_path="shibing624/text2vec-base-chinese")

相似度计算

similarity可以计算两个文本字符串或字符串列表之间的相似度

代码
m.similarity('自然语言处理用于文本分析。',["词袋模型是一种常用的文本表示方法。","神经网络可以实现图像分类。"])

distance可以计算两个文本字符串或字符串列表之间的距离

代码
m.distance('自然语言处理用于文本分析','自然语言处理用于文本分析')

计算距离矩阵

代码
import pandas as pd

text_data = data = [
    "神经网络可以实现图像分类。", 
    "深度学习技术已经成为人工智能的核心。", 
    "神经网络模型在医学影像诊断中具有潜力。", 
    "卷积神经网络在视频分析中发挥重要作用。", 
    "深度学习模型可以进行复杂的推理任务。", 
    "神经网络模型可以帮助改善医疗诊断。", 
    "卷积神经网络在自动驾驶领域有着广泛应用。", 
    "文本分类是自然语言处理中常见的任务。", 
    "推荐系统可以提升用户体验。", 
    "数据挖掘可以发现隐藏在数据中的规律。", 
    "文本生成是人工智能的热门领域。", 
    "推荐系统可以根据用户喜好进行个性化推荐。", 
    "数据挖掘技术可以帮助企业做出更明智的决策。", 
    "文本生成模型可以创作出令人惊叹的文本内容。", 
    "推荐系统的算法可以不断优化用户的推荐体验。", 
    "数据挖掘可以帮助发现数据中隐藏的宝藏。", 
    "文本分类技术可以帮助整理海量文本信息。", 
    "推荐系统是许多互联网平台的核心功能。", 
    "数据挖掘可以帮助企业更好地了解市场趋势。", 
    "文本生成技术可以为创作者提供灵感和帮助。", 
    "推荐系统可以根据用户行为进行智能推荐。", 
    "机器学习可以帮助预测未来趋势。", 
    "大数据时代带来了数据驱动的决策。", 
    "人工智能正在改变我们的生活方式。", 
    "机器学习算法有监督学习和无监督学习。", 
    "大数据分析可以帮助企业做出更明智的决策。", 
    "人工智能技术可以为社会带来巨大的改变。", 
    "机器学习模型可以根据数据进行智能学习。", 
    "大数据处理技术可以帮助加快数据分析速度。", 
    "人工智能的发展将深刻影响各行各业。", 
    "机器学习算法可以根据数据进行自动优化。", 
    "模型评估是机器学习中重要的一环。", 
    "模型融合可以提高预测准确率。", 
    "模型优化是提升性能的关键。", 
    "模型训练需要耗费大量计算资源。", 
    "模型调参可以提高模型泛化能力。", 
    "数据科学是一个跨学科领域。", 
    "模式识别是人工智能的重要分支。", 
    "数据分析可以帮助企业做出决策。", 
    "时间序列分析可以预测未来走势。", 
    "数据科学家是当今最炙手可热的职业之一。"
]

text_distance = m.distance(text_data,text_data)
text_distance_matrix = text_distance.numpy()
import numpy as np

# 将对角线值变为0
np.fill_diagonal(text_distance_matrix, 0)

文本聚类

代码
from sklearn.cluster import DBSCAN

# 距离小于0.3,即相似度大于70%的分为一类 
db1 = DBSCAN(eps=0.3, min_samples=2, metric='precomputed').fit(text_distance_matrix)
# labels = -1代表没有被分到任何类别之中
df_text = pd.DataFrame({'text':text_data,'label':db1.labels_})
df_text.sort_values('label',ascending = False)

PCA降维

代码
text_embeddings = m.get_embeddings(text_data)
from sklearn.decomposition import PCA

# 假设embeddings是返回的嵌入矩阵
pca = PCA(n_components=2)  # 指定要降到的维度
embeddings_pca = pca.fit_transform(text_embeddings)

可视化展示

代码
import plotly.express as px
df_text['x'] = embeddings_pca[:, 0]
df_text['y'] = embeddings_pca[:, 1]
# 创建交互式散点图
fig = px.scatter(df_text, x='x', y='y',color = 'label',hover_data={'text': True})

# 设置图表布局
fig.update_layout(title='文本相似聚类',
                  xaxis_title='主成分1',
                  yaxis_title='主成分2',
                  showlegend=False)

# 显示图表
fig.show()

文库检索

代码
m = BertSimilarity(model_name_or_path="shibing624/text2vec-base-chinese")
# 将文本列表添加至文库
m.add_corpus(text_data)

text = ["文本分类技术", "人工智能技术"]


def find_similar_text(text, topn=3):
    if isinstance(text, list):
        similar_texts = {}
        for t in text:
            res = m.most_similar(t, topn=topn)
            keys = list(res[0][0].keys())
            similar_text = [m.corpus.get(key) for key in keys]
            score = list(res[0][0].values())
            similar_texts[t] = dict(zip(similar_text, score))
        return similar_texts
    else:
        res = m.most_similar(text, topn=topn)
        keys = list(res[0][0].keys())
        similar_text = [m.corpus.get(key) for key in keys]
        score = list(res[0][0].values())
        return dict(zip(similar_text, score))


find_similar_text(text)

分词

代码
# 分词

# !pip install --upgrade paddlepaddle-i https://pypi.tuna.tsinghua.edu.cn/simple
# !pip install --upgrade  paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# !pip install --upgrade paddlenlp -i https://pypi.org/simple
import paddle
from paddlenlp import Taskflow

lac = Taskflow("lexical_analysis")

text_lac = lac(["模型评估是机器学习中重要的一环。", "文本生成模型可以创作出令人惊叹的文本内容。"])
import pandas as pd
pd.DataFrame(text_lac)

# 词性
data = [
    ("n", "普通名词"),
    ("f", "方位名词"),
    ("s", "处所名词"),
    ("t", "时间"),
    ("nr", "人名"),
    ("ns", "地名"),
    ("nt", "机构名"),
    ("nw", "作品名"),
    ("nz", "其他专名"),
    ("v", "普通动词"),
    ("vd", "动副词"),
    ("vn", "名动词"),
    ("a", "形容词"),
    ("ad", "副形词"),
    ("an", "名形词"),
    ("d", "副词"),
    ("m", "数量词"),
    ("q", "量词"),
    ("r", "代词"),
    ("p", "介词"),
    ("c", "连词"),
    ("u", "助词"),
    ("xc", "其他虚词"),
    ("w", "标点符号"),
    ("PER", "人名"),
    ("LOC", "地名"),
    ("ORG", "机构名"),
    ("TIME", "时间"),
]




pos_tag_df = pd.DataFrame(data,columns=["tags", "词性"])

信息抽取

代码
from pprint import pprint
wordtag_ie = Taskflow("knowledge_mining", with_ie=True)
schema = [
  {
    "head_role": "作品类_实体", #头实体词类
    "group": "创作者", #关系名
    "tail_role": [
      {
        "main": [
          "人物类_实体" #尾实体词类
        ],
        "support": [] #相关词类,可作为该关系的补充,不可作为尾实体独立存在
      }
    ],
    "trig_word": [
      "作词", #触发词,对于没有触发词,而是由头尾实体直接触发的关系,可为null
    ],
    "trig_type": "trigger", #trigger表明由触发词触发,tail表明为尾实体触发
    "reverse": False, #是否为反向配置,即尾实体实际是头,头实体实际是尾
    "trig_direction": "B", #触发P的方向,表示在自然表达中,尾实体在触发词的哪一边,L为左,R为右,B为双向都有可能,默认为B
    "rel_group": "创作" #对应的反关系,即头尾实体对调后,对应的关系,用于逻辑推断
  }]
wordtag_ie.set_schema(schema)
pprint(wordtag_ie('《忘了所有》是一首由王杰作词、作曲并演唱的歌曲,收录在专辑同名《忘了所有》中,由波丽佳音唱片于1996年08月31日发行。')[1])

问题生成

代码
from paddlenlp import Taskflow
# 默认模型为 unimo-text-1.0-dureader_qg
question_generator = Taskflow("question_generation")
# 单条输入
question_generator([
  {"context": "奇峰黄山千米以上的山峰有77座,整座黄山就是一座花岗岩的峰林,自古有36大峰,36小峰,最高峰莲花峰、最险峰天都峰和观日出的最佳点光明顶构成黄山的三大主峰。", "answer": "莲花峰"}
])

# 多条输入
question_generator([
  {"context": "奇峰黄山千米以上的山峰有77座,整座黄山就是一座花岗岩的峰林,自古有36大峰,36小峰,最高峰莲花峰、最险峰天都峰和观日出的最佳点光明顶构成黄山的三大主峰。", "answer": "莲花峰"},
  {"context": "弗朗索瓦·韦达外文名:franciscusvieta国籍:法国出生地:普瓦图出生日期:1540年逝世日期:1603年12月13日职业:数学家主要成就:为近代数学的发展奠定了基础。", "answer": "法国"}
  ])

文本摘要

代码
import paddle
from paddle.nn import Linear, Embedding, Conv2D
import numpy as np
import paddle.nn.functional as F
import paddle.nn as nn

# 声明用户的最大ID,在此基础上加1(算上数字0)
USR_ID_NUM = 6040000 + 1
# 声明Embedding 层,将ID映射为32长度的向量
usr_emb = Embedding(num_embeddings=USR_ID_NUM,
                    embedding_dim=32,
                    sparse=False)
# 声明输入数据,将其转成tensor
arr_1 = np.array([1], dtype="int64").reshape((-1))
print(arr_1)
arr_pd1 = paddle.to_tensor(arr_1)
print(arr_pd1)
# 计算结果
emb_res = usr_emb(arr_pd1)
# 打印结果
print("数字 1 的embedding结果是: ", emb_res.numpy(), "\n形状是:", emb_res.shape)
代码
from paddlenlp import Taskflow
summarizer = Taskflow("text_summarization")
# 单条输入
summarizer(
  '2022年,中国房地产进入转型阵痛期,传统“高杠杆、快周转”的模式难以为继,万科甚至直接喊话,中国房地产进入“黑铁时代”')
代码
# 多条输入
summarizer([
  '据悉,2022年教育部将围绕“巩固提高、深化落实、创新突破”三个关键词展开工作。要进一步强化学校教育主阵地作用,继续把落实“双减”作为学校工作的重中之重,重点从提高作业设计水平、提高课后服务水平、提高课堂教学水平、提高均衡发展水平四个方面持续巩固提高学校“双减”工作水平。',
  '党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有一定的稳定预防工作作用,因此平时口服党参能远离三高的危害。另外党参除了益气养血,降低中枢神经作用,调整消化系统功能,健脾补肺的功能。'
])
回到顶部