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('自然语言处理用于文本分析。',["词袋模型是一种常用的文本表示方法。","神经网络可以实现图像分类。"])
tensor([[0.5412, 0.5846]])

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

代码
m.distance('自然语言处理用于文本分析','自然语言处理用于文本分析')
tensor([[-1.1921e-07]])

计算距离矩阵

代码
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)
text label
26 人工智能技术可以为社会带来巨大的改变。 4
29 人工智能的发展将深刻影响各行各业。 4
23 人工智能正在改变我们的生活方式。 4
22 大数据时代带来了数据驱动的决策。 3
12 数据挖掘技术可以帮助企业做出更明智的决策。 3
38 数据分析可以帮助企业做出决策。 3
25 大数据分析可以帮助企业做出更明智的决策。 3
15 数据挖掘可以帮助发现数据中隐藏的宝藏。 3
18 数据挖掘可以帮助企业更好地了解市场趋势。 3
9 数据挖掘可以发现隐藏在数据中的规律。 3
28 大数据处理技术可以帮助加快数据分析速度。 2
16 文本分类技术可以帮助整理海量文本信息。 2
7 文本分类是自然语言处理中常见的任务。 2
1 深度学习技术已经成为人工智能的核心。 1
30 机器学习算法可以根据数据进行自动优化。 1
21 机器学习可以帮助预测未来趋势。 1
20 推荐系统可以根据用户行为进行智能推荐。 1
14 推荐系统的算法可以不断优化用户的推荐体验。 1
17 推荐系统是许多互联网平台的核心功能。 1
31 模型评估是机器学习中重要的一环。 1
11 推荐系统可以根据用户喜好进行个性化推荐。 1
32 模型融合可以提高预测准确率。 1
8 推荐系统可以提升用户体验。 1
33 模型优化是提升性能的关键。 1
35 模型调参可以提高模型泛化能力。 1
4 深度学习模型可以进行复杂的推理任务。 1
37 模式识别是人工智能的重要分支。 1
27 机器学习模型可以根据数据进行智能学习。 1
0 神经网络可以实现图像分类。 0
6 卷积神经网络在自动驾驶领域有着广泛应用。 0
5 神经网络模型可以帮助改善医疗诊断。 0
3 卷积神经网络在视频分析中发挥重要作用。 0
2 神经网络模型在医学影像诊断中具有潜力。 0
24 机器学习算法有监督学习和无监督学习。 -1
19 文本生成技术可以为创作者提供灵感和帮助。 -1
13 文本生成模型可以创作出令人惊叹的文本内容。 -1
10 文本生成是人工智能的热门领域。 -1
34 模型训练需要耗费大量计算资源。 -1
36 数据科学是一个跨学科领域。 -1
39 时间序列分析可以预测未来走势。 -1
40 数据科学家是当今最炙手可热的职业之一。 -1

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].keys())
            similar_text = [m.corpus.get(key) for key in keys]
            score = list(res[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].keys())
        similar_text = [m.corpus.get(key) for key in keys]
        score = list(res[0].values())
        return dict(zip(similar_text, score))

find_similar_text(text)
{'文本分类技术': {'文本分类是自然语言处理中常见的任务。': 0.794960618019104,
  '文本分类技术可以帮助整理海量文本信息。': 0.728316068649292,
  '文本生成是人工智能的热门领域。': 0.6121734380722046},
 '人工智能技术': {'深度学习技术已经成为人工智能的核心。': 0.7299830913543701,
  '机器学习模型可以根据数据进行智能学习。': 0.6916491985321045,
  '模式识别是人工智能的重要分支。': 0.6602110266685486}}

分词

代码
# 分词

# !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])
[[{'GROUP': '创作',
   'HEAD_ROLE': {'item': '王杰', 'offset': 10, 'type': '人物类_实体'},
   'SRC': 'REVERSE',
   'TAIL_ROLE': [{'item': '忘了所有', 'offset': 1, 'type': '作品类_实体'}],
   'TRIG': [{'item': '作词', 'offset': 12}]},
  {'GROUP': '创作者',
   'HEAD_ROLE': {'item': '忘了所有', 'offset': 1, 'type': '作品类_实体'},
   'SRC': 'HTG',
   'TAIL_ROLE': [{'item': '王杰', 'offset': 10, 'type': '人物类_实体'}],
   'TRIG': [{'item': '作词', 'offset': 12}]}]]

问题生成

代码
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)
[1]
Tensor(shape=[1], dtype=int64, place=Place(cpu), stop_gradient=True,
       [1])
数字 1 的embedding结果是:  [[-1.04487466e-04  8.39471701e-04 -2.22284871e-04  3.58306337e-04
   1.66397542e-04  3.84662068e-04  8.82440130e-04  2.58976943e-04
  -5.10094280e-04 -9.54593997e-05 -7.60814291e-04  3.90649075e-04
  -5.90627547e-04  4.23129881e-04 -2.49802310e-04 -9.43572377e-05
   7.11175147e-04  9.75174131e-04  9.22359759e-04  4.10739216e-04
  -3.96169082e-04 -4.26606799e-04  7.17374729e-04  5.59512293e-04
  -1.38814794e-05 -9.23625950e-04  9.77242831e-04  3.11442884e-04
   5.57614840e-04  8.98360740e-05  9.87145584e-04 -1.22190802e-04]] 
形状是: [1, 32]
代码
from paddlenlp import Taskflow
summarizer = Taskflow("text_summarization")
# 单条输入
summarizer(
  '2022年,中国房地产进入转型阵痛期,传统“高杠杆、快周转”的模式难以为继,万科甚至直接喊话,中国房地产进入“黑铁时代”')
['“黑铁”时代的中国房地产']
代码
# 多条输入
summarizer([
  '据悉,2022年教育部将围绕“巩固提高、深化落实、创新突破”三个关键词展开工作。要进一步强化学校教育主阵地作用,继续把落实“双减”作为学校工作的重中之重,重点从提高作业设计水平、提高课后服务水平、提高课堂教学水平、提高均衡发展水平四个方面持续巩固提高学校“双减”工作水平。',
  '党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有一定的稳定预防工作作用,因此平时口服党参能远离三高的危害。另外党参除了益气养血,降低中枢神经作用,调整消化系统功能,健脾补肺的功能。'
])
['', '有有降血压的作用']
回到顶部