小说人物分析与形象生成

释放双眼,带上耳机,听听看~!
本文介绍了使用Python实现的一个文本自动摘要工具,通过分析小说人物和生成形象来帮助读者更好地理解小说内容。通过jieba分词和TF-IDF算法,可以将文本分成句子并计算关键词的权重,从而生成摘要和形象描述。这个工具可以在写作、研究和阅读理解等方面发挥重要作用。

小说人物分析与形象生成

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,使用Python实现一个文本自动摘要工具

import jieba
import numpy as np
import collections
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  


def split_sentence(text, punctuation_list='!?。!?'):
    """
    将文本段安装标点符号列表里的符号切分成句子,将所有句子保存在列表里。
    """
    sentence_set = []
    inx_position = 0         #索引标点符号的位置
    char_position = 0        #移动字符指针位置
    for char in text:
        char_position += 1
        if char in punctuation_list:
            next_char = list(text[inx_position:char_position+1]).pop()
            if next_char not in punctuation_list:
                sentence_set.append(text[inx_position:char_position])
                inx_position = char_position
    if inx_position < len(text):
        sentence_set.append(text[inx_position:])

    sentence_with_index = {i:sent for i,sent in enumerate(sentence_set)} #dict(zip(sentence_set, range(len(sentences))))
    return sentence_set,sentence_with_index

def get_tfidf_matrix(sentence_set,stop_word):
    corpus = []
    for sent in sentence_set:
        sent_cut = jieba.cut(sent)
        sent_list = [word for word in sent_cut if word not in stop_word]
        sent_str = ' '.join(sent_list)
        corpus.append(sent_str)

    vectorizer=CountVectorizer()
    transformer=TfidfTransformer()
    tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))
    # word=vectorizer.get_feature_names()
    tfidf_matrix=tfidf.toarray()
    return np.array(tfidf_matrix)

def get_sentence_with_words_weight(tfidf_matrix):
    sentence_with_words_weight = {}
    for i in range(len(tfidf_matrix)):
        sentence_with_words_weight[i] = np.sum(tfidf_matrix[i])

    max_weight = max(sentence_with_words_weight.values()) #归一化
    min_weight = min(sentence_with_words_weight.values())
    for key in sentence_with_words_weight.keys():
        x = sentence_with_words_weight[key]
        sentence_with_words_weight[key] = (x-min_weight)/(max_weight-min_weight)

    return sentence_with_words_weight

def get_sentence_with_position_weight(sentence_set):
    sentence_with_position_weight = {}
    total_sent = len(sentence_set)
    for i in range(total_sent):
        sentence_with_position_weight[i] = (total_sent - i) / total_sent
    return sentence_with_position_weight

def similarity(sent1,sent2):
    """
    计算余弦相似度
    """
    return np.sum(sent1 * sent2) / 1e-6+(np.sqrt(np.sum(sent1 * sent1)) *
                                    np.sqrt(np.sum(sent2 * sent2)))

def get_similarity_weight(tfidf_matrix):
    sentence_score = collections.defaultdict(lambda :0.)
    for i in range(len(tfidf_matrix)):
        score_i = 0.
        for j in range(len(tfidf_matrix)):
            score_i += similarity(tfidf_matrix[i],tfidf_matrix[j])
        sentence_score[i] = score_i

    max_score = max(sentence_score.values()) #归一化
    min_score = min(sentence_score.values())
    for key in sentence_score.keys():
        x = sentence_score[key]
        sentence_score[key] = (x-min_score)/(max_score-min_score)

    return sentence_score

def ranking_base_on_weigth(sentence_with_words_weight,
                            sentence_with_position_weight,
                            sentence_score, feature_weight = [1,1,1]):
    sentence_weight = collections.defaultdict(lambda :0.)
    for sent in sentence_score.keys():
        sentence_weight[sent] = feature_weight[0]*sentence_with_words_weight[sent] +
                                feature_weight[1]*sentence_with_position_weight[sent] +
                                feature_weight[2]*sentence_score[sent]

    sort_sent_weight = sorted(sentence_weight.items(),key=lambda d: d[1], reverse=True)
    return sort_sent_weight

def get_summarization(sentence_with_index,sort_sent_weight,topK_ratio =0.3):
    topK = int(len(sort_sent_weight)*topK_ratio)
    summarization_sent = sorted([sent[0] for sent in sort_sent_weight[:topK]])
    
    summarization = []
    for i in summarization_sent:
        summarization.append(sentence_with_index[i])

    summary = ''.join(summarization)
    return summary


if __name__ == '__main__':
    test_text = 'rose.txt'
    # with open(test_text,'r', encoding="gb18030") as f:
    with open(test_text,'r') as f:

        text = f.read()
    stop_word = []
    with open('StopWords.txt','r') as f:
        for line in f.readlines():
            stop_word.append(line.strip())

    sentence_set,sentence_with_index = split_sentence(text, punctuation_list='!?。!?')
    tfidf_matrix = get_tfidf_matrix(sentence_set,stop_word)
    sentence_with_words_weight = get_sentence_with_words_weight(tfidf_matrix)
    sentence_with_position_weight = get_sentence_with_position_weight(sentence_set)
    sentence_score = get_similarity_weight(tfidf_matrix)
    sort_sent_weight = ranking_base_on_weigth(sentence_with_words_weight,
                                                sentence_with_position_weight,
                                                sentence_score, feature_weight = [1,1,1])
                                                
    summarization = get_summarization(sentence_with_index,sort_sent_weight,topK_ratio=0.8)
    # print(type(summarization))
    # test_text_out = 'rose_out.txt'
    # with open(test_text_out,'w') as f:
    #     f.write(summarization)

    print('summarization:n',summarization)

summarization:
 一个很漂亮的女孩子——这是郝仁的第一印象。对方一身挺清凉的打扮,上身穿着件贴身的白色短袖衫,衣领上缀着一片略有些孩子气的塑料小狗装饰,下身则是深色的短裤+休闲鞋,看起来好像一个偷偷翘课出来逛街的女大学生。这个自来熟的女孩子留着一头披肩短发,可能是很喜欢运动吧,皮肤带着些微的小麦色,健康又充满阳光,她的容貌秀丽可人,最让人注意的是那一双灵动的大眼睛,比郝仁见过的任何一双眼睛都充满活力,仿佛整个人的精气神都要从这双眼睛中透出来一样。

2.2 关键词提取

jieba模块的关键词获取可以通过两种方式来获取:

  1. 在使用jieba分词对文本进行处理之后,可以通过统计词频来获取关键词:jieba.analyse.extract_tags(news, topK=10),获取词频在前10的作为关键词。
  2. 使用TF-IDF权重来进行关键词获取,首先需要对文本构建词频矩阵,其次才能使用向量求TF-IDF值。
import jieba
import jieba.analyse
 
text = summarization

promt_texyrank =list()
# 基于TextRank
keywords = jieba.analyse.textrank(text, topK=5, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v'))
for item in keywords:
    print(item[0], item[1])

    promt_texyrank.append(item[0])
白色 1.0
翘课 0.8915410498073457
出来 0.8867536986126129
着件 0.8553706593637174
短袖衫 0.8453456531844306
import jieba.analyse as analyse
tfidf = analyse.extract_tags

test_text = summarization
# with open(test_text,'r',) as f:
#     text = f.read()
promt_tfidf =list()

# TF-IDF 提取关键词
keywords = tfidf(test_text, topK=5, withWeight=True, allowPOS=())
for item in keywords:
    print(item[0], item[1])
    promt_tfidf.append(item[0])
女孩子 0.22130913022742857
眼睛 0.220014001314
一双 0.194186673114
休闲鞋 0.18867900673428573
郝仁 0.17078239289857142

2.3 小结

  通过本小节,我们已经拿到了需要输入的promt,但是我们同时也可以发现提取到的promt并没有非常理想,此处不足之处大概有两个原因,一是对于整个文档的摘要提取,计算句子权重的问题,当然,这段描述文字偏少也是其中的一个问题;二是关键词的提取,并不能非常有效的提取到所有的形容词。在这里可以给大家提供两个优化思路,其一,使用PaddleNLP的摘要提取功能,直接使用其生成的摘要作为输入的promt或者对promt提取关键词之后再输入;其二,使用文心大模型的摘要提取功能,但是字数需要限制在1000字以内,这两种优化方式不是很难,大家可以尝试做一下。

三、人物形象图生成

# -*- coding: utf-8 -*
! pip install wenxin-api
import wenxin_api # 可以通过"pip install wenxin-api"命令安装
from wenxin_api.tasks.text_to_image import TextToImage
wenxin_api.ak = ""
wenxin_api.sk = ""
input_dict = {
    "text":  promt_tfidf + promt_texyrank + ["超高清,动漫,超细节,唯美,插画,壁纸"],
    "style": "二次元", #解锁更多风格后,非必选参数
    "resolution":"1024*1024" , #也可设置为 1024*1536、1536*1024
    "num": "2",    #功能解锁后,可设置的范围为[1,2,3,4,5,6]
}
rst = TextToImage.create(**input_dict)
print(rst)
2023-01-28 11:20:01,006 - model is painting now!, taskId: 13230768, waiting: 2m
{'imgUrls': ['https://wenxin.baidu.com/younger/file/ERNIE-ViLG/0dbd02ced2ee0feb6726c127347e7fceex', 'https://wenxin.baidu.com/younger/file/ERNIE-ViLG/0dbd02ced2ee0feb6726c127347e7fcei4']}

四、总结

  AIGC 就是用人工智能来进行内容生产,它的特点是有非常强大的内容生产力,大幅提升内容生产的质量和效率,将来也会极大地丰富大家的数字生活。跨模态内容生成。核心来讲,我们希望用文本的描述来生成视觉的内容。比如说一句话能生成一个图像,或者我们写一篇文章,能把文章自动转成视频。

  首先要做文本理解,也就是我们常说的 Prompt 学习,这里面其实主要是要做一些理解,并根据知识进行扩充。当然,最核心的部分还是文生图。文本已经确定下来了,输入到系统里面,效果一定要足够的好。为此,百度提出了 ERNIE-ViLG 2. 0,这是一个知识增强的混合降噪专家模型。

  从图文相关性上面来看,在跨模态生成里面,语言跟视觉之间的对应关系要做得很好,才能保证用户说什么就生成什么。技术上主要通过对语言、视觉还有跨模态做一些知识增强,更好的实现跨模态知识之间的映射,从而实现图文相关性的提升

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

基于机器学习的关联规则方法对IC电子产品的数据挖掘

2023-12-22 12:15:14

AI教程

chatGPT介绍及应用总结

2023-12-22 12:25:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索