【Python】—— 文本分析

news2024/9/21 14:48:29

文本分析

  • 相关知识
    • 1. 文本数据处理
    • 2. 文本可视化
    • 3. Python编程
    • 4. 词频统计
    • 5. 人名提取
    • 6. 自然段划分
    • 7. 人物出现频率分布分析
    • 8. 词云生成
  • 实验内容
    • 数据下载地址:
    • 1.对纯英文小说进行分析。
    • 2.对中文小说进行分析。
  • 问题与解决
  • 附录
    • 1.对纯英文小说进行分析。
    • 2.对中文小说进行分析。

相关知识

      当涉及到文本数据处理和可视化的任务时,我们可以通过了解下面的知识和使用Python的一些主要库和工具来完成这些任务。

1. 文本数据处理

      包括读取文本文件、对文本进行分词、去除停用词等基本文本处理步骤。

  • 读取文本文件:
  • 在Python中,我们使用open函数打开文件,指定文件名、打开模式(这里是’r’表示读取)、以及字符编码(通常是’utf-8’)。
with open('filename.txt', 'r', encoding='utf-8') as file:
    text_data = file.read()
  • 分词和去除停用词:
  • 使用Natural Language Toolkit(NLTK)库进行分词和去除停用词。分词是将文本拆分成单词的过程,而停用词是指那些在文本中频繁出现但没有实际含义的词汇,可以通过NLTK提供的停用词列表进行去除。
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

stop_words = set(stopwords.words('english'))

words = word_tokenize(text_data)
filtered_words = [word.lower() for word in words if word.isalpha() and word.lower() not in stop_words]

2. 文本可视化

      通过词云制作实现文本数据的可视化呈现。

  • 使用wordcloud生成词云图:
  • WordCloud是一个用于生成词云图的库,它根据文本中单词的频率生成具有可视化效果的图形。在示例代码中,我们通过WordCloud生成词云图,并使用matplotlib展示。
from wordcloud import WordCloud
import matplotlib.pyplot as plt

wordcloud = WordCloud().generate(' '.join(filtered_words))

plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

使用 wordcloud 库生成词云图的过程主要分为以下几个步骤:

  1. 安装 wordcloud 库:
          在命令行或终端中运行以下命令安装 wordcloud

    pip install wordcloud
    
  2. 导入库:

    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    
  3. 准备文本数据:
          获取需要生成词云的文本数据,确保文本数据是字符串形式。

  4. 创建 WordCloud 对象并生成词云:

    wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text_data)
    

          在这里,我们创建了一个 WordCloud 对象,指定了词云的宽度、高度和背景颜色。可以根据需要调整其他参数,比如字体、最大词汇量等。

  5. 可选步骤 - 自定义词云形状:
          如果你想要词云的形状为特定图形,可以使用自定义形状的图片。首先,你需要准备一张形状的图片,然后使用 WordCloudmask 参数指定该图片。

    from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
    from PIL import Image
    
    # 读取形状图片
    mask = np.array(Image.open("your_shape_image.png"))
    
    # 使用形状图片生成词云
    wordcloud = WordCloud(mask=mask, background_color="white").generate(text_data)
    
  6. 显示或保存词云图:

    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis("off")
    
    # 显示词云图
    plt.show()
    
    # 或保存词云图
    wordcloud.to_file("wordcloud_output.png")
    

          使用 plt.show() 可以在运行脚本时显示词云图,而 to_file 方法可以保存词云图为图片文件。
          总体来说,使用 wordcloud 库生成词云图是一个相对简单的过程,主要涉及创建 WordCloud 对象并调整相关参数,然后通过 imshow 方法显示或通过 to_file 方法保存生成的词云图。


3. Python编程

      可看Python专栏
      要求通过Python实现上述功能,因此需要熟悉Python编程语言及其相关库和模块。

4. 词频统计

      对文本中各个词汇的出现频率进行统计分析。

  • 使用Counter进行词频统计:
  • Counter是Python的一个内置库,用于统计可哈希对象的出现次数。在这里,我们使用Counter来统计文本中单词的出现频率。
from collections import Counter
word_freq = Counter(filtered_words)

5. 人名提取

      从文本中提取人物名称,这可能需要使用一些自然语言处理(NLP)的技术或者规则来实现。

  • 使用spaCy进行实体识别:
  • spaCy是一个自然语言处理库,它提供了实体识别功能,可以用于从文本中提取人名等实体。在示例代码中,我们加载了英文的spaCy模型,并使用它来获取文本中的人物名称。
import spacy

nlp = spacy.load('en_core_web_sm')
doc = nlp(text_data)

person_names = [ent.text for ent in doc.ents if ent.label_ == 'PERSON']

6. 自然段划分

      将文本划分成自然段,可能涉及到对文本的分段或分句处理。

  • 使用正则表达式进行自然段划分:
  • 正则表达式是一种强大的文本匹配工具,可以根据特定的模式来划分文本。在这里,我们使用\n\n来划分自然段,表示两个换行符之间的文本。
import re

paragraphs = re.split('\n\n', text_data)

7. 人物出现频率分布分析

      分析文本中人物出现的频率分布情况,可以通过统计每个人物在文本中出现的次数来实现。

  • 统计人物出现频率:
  • 通过使用Counter,我们可以轻松地统计从文本中提取的人物名称的出现频率,从而进行人物出现频率分布分析。
character_freq = Counter(person_names)

8. 词云生成

      使用wordcloud模块生成词云图,这需要将词频等信息传递给词云模块,并对生成的图像进行一定的定制。
综合来看,这涉及到文本处理、数据统计、可视化和一定的自然语言处理方面的知识和技能。

  • 定制词云图:
  • 在生成词云图时,可以通过调整WordCloud的参数来定制图形的外观,包括图像的大小、背景颜色等。示例代码中展示了如何设置词云的宽度、高度和背景颜色。
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(word_freq)

plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

实验内容

数据下载地址:

       文本分析所用小说(数据)

1.对纯英文小说进行分析。

主要步骤如下:
      下载一篇纯英文小说,保存为txt文档。
      打开小说文件,通过对字符串的处理(注意统计中要去掉各种标点符号,除英文以外的内容。),统计小说中所有英文单词的使用频次,结果保存在一个字典中。
      对字典中的数据进行排序,按照使用频次从高到低进行排序,并把统计结果写到一个文本文件中。
      把单词的使用频次的信息用词云的方式显示出来。

小说文件截图(处理小说源文件):
在这里插入图片描述

代码截图:
在这里插入图片描述
在这里插入图片描述
运行结果(词云):
在这里插入图片描述

生成词典并排序截图:
在这里插入图片描述

2.对中文小说进行分析。

      对于中文小说的词频统计、人名提取、自然段划分和人物出现频率分布分析,并利用wordcloud模块生成词云图。

主要步骤如下:
      下载一篇中文小说,字数在十万字以上。使用中文分词库进行分词。统计使用最多的人名和中文词汇并输出。
      列出小说中的主要人物,包括主人公,以及另外相关人物5人或以上。
      把小说分段,分析出小说一共有多少自然段。并统计出上面列出的人物共在多少个自然段中出现。并用某种输出模式体现出这种分布情况,例如在第一段出现,输出一个字符,在第二段没有出现,输出一个空格。可以直观的看出人物出现的位置和频率。
      分析主人公以及其他相关人物之间的亲密度,两个人在同一个自然段同时出现亲密度加1,最后得到统计结果。
      把词频的统计结果用词云的方式显示出来。

小说原文件截图(处理小说源文件):

在这里插入图片描述
代码截图:
在这里插入图片描述
在这里插入图片描述
运行结果(词云):
在这里插入图片描述
段落数截图:
在这里插入图片描述
细节:
人物出现频率截图
主角(阿龙纳斯):
在这里插入图片描述

配角1(康赛尔):
在这里插入图片描述

配角2(尼德•兰):
在这里插入图片描述

配角3(尼摩船长):
在这里插入图片描述

配角4(何伯逊敬启):
在这里插入图片描述

配角5(教授):
在这里插入图片描述

亲密度:
在这里插入图片描述

问题与解决

操作异常:在使用中文分词库jieba时,可能会遇到编码问题,导致分词不准确。
解决方案:在打开和处理文件时,使用正确的编码格式进行操作。可以尝试使用UTF-8编码,因为它在处理中文文本时通常表现良好。

操作异常:在使用wordcloud模块时,可能由于依赖 matplotlibNumPy 的安装问题而导致出现ImportError。

解决方案:可以尝试重新安装matplotlibnumpy模块,或者在虚拟环境中安装这些模块,以解决依赖库安装问题。

异常问题:处理中文小说时候,因为没有安装Python和jieba分词库代码无法运行。
解决方案:使用以下命令安装jieba:pip install jieba

异常问题:在处理英文小说时,代码中使用了nltk库和wordcloud库,但是用户没有提前安装这两个库,导致代码运行时报错。
解决方案:用户在运行代码前应该使用以下命令安装所需的库:pip install nltkpip install wordcloud

操作异常:因为没有设置中文字体路径词云图无法读出中文。
解决方案:下载该文件并加入代码font_path = 'zitiaozichangyinghedianshan.ttf # 设置中文字体路径

附录

1.对纯英文小说进行分析。

#英文小说单词使用频次统计和词云制作:
# 导入需要的库
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import string

# 读取小说文件
with open('H:/其他/小说/after twenty years.txt', 'r' ,encoding='utf-8') as f:
    novel = f.read()

# 去除标点符号和数字
translator = str.maketrans('', '', string.punctuation + string.digits)
novel = novel.translate(translator)

# 将小说中的单词转换为小写,并按照空格分割成列表
words = novel.lower().split()

# 统计单词出现频次
word_freq = {}
for word in words:
    if word in word_freq:
        word_freq[word] += 1
    else:
        word_freq[word] = 1

# 按照单词出现频次从高到低排序
sorted_word_freq = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)

# 将排序结果写入文件
with open('H:/其他/小说/word_after twenty years.txt', 'w' ,encoding='utf-8') as f:
    for word, freq in sorted_word_freq:
        f.write(f'{word}: {freq}\n')

# 生成词云
wordcloud = WordCloud(width=800, height=800, background_color='white').generate_from_frequencies(word_freq)
plt.figure(figsize=(8, 8), facecolor=None)
plt.imshow(wordcloud)
plt.axis('off')
plt.tight_layout(pad=0)
plt.show()

2.对中文小说进行分析。

from wordcloud import WordCloud
import jieba
from collections import Counter
import matplotlib.pyplot as plt

# 设置中文字体路径
font_path = 'zitiaozichangyinghedianshan.ttf'

# 读取中文小说文件
with open('H:/其他/小说/海底两万里.txt', 'r', encoding='utf-8') as file:
    chinese_novel_text = file.read()

# 中文分词
seg_list = jieba.lcut(chinese_novel_text)

# 统计词频
word_counts = Counter(seg_list)

# 将词频字典转换为单个字符串
wordcloud_text = ' '.join(seg_list)

# 生成词云
wordcloud = WordCloud(width=800, height=400, background_color='white', font_path=font_path).generate(wordcloud_text)

# 显示词云图像
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

# 填入小说中的主要人物,包括主人公和其他相关人物5人或以上
main_characters = ["阿龙纳斯", "康赛尔", "尼德•兰", "尼摩船长", "何伯逊敬启", "教授"]

# 分析小说自然段
paragraphs = chinese_novel_text.split('\n')
print("小说一共有{}自然段。".format(len(paragraphs)))

# 列出主要人物在每个自然段的出现情况
character_occurrence = {char: [0] * len(paragraphs) for char in main_characters}
for i, paragraph in enumerate(paragraphs):
    for char in main_characters:
        if char in paragraph:
            character_occurrence[char][i] = 1

# 输出人物在自然段中的出现情况
for char in main_characters:
    print("{}在各自然段的出现情况:".format(char), character_occurrence[char])

# 统计主要人物之间的亲密度
intimacy_matrix = [[0] * len(main_characters) for _ in range(len(main_characters))]
for i in range(len(main_characters)):
    for j in range(i + 1, len(main_characters)):
        for k in range(len(paragraphs)):
            if character_occurrence[main_characters[i]][k] and character_occurrence[main_characters[j]][k]:
                intimacy_matrix[i][j] += 1

# 输出亲密度矩阵
print("人物亲密度矩阵:")
for row in intimacy_matrix:
    print(row)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】超详解strncpystrncatstrncmpstrerrorperror的使⽤和模拟实现

🌈write in front :🔍个人主页 : 啊森要自信的主页 ✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&am…

Python自动化测试系列[v1.0.0][多种数据驱动实现附源码]

前情提要 请确保已经熟练掌握元素定位的常用方法及基本支持,请参考Python自动化测试系列[v1.0.0][元素定位] 数据驱动测试是自动化测试中一种重要的设计模式,这种设计模式可以将测试数据和测试代码分开,实现数据与代码解耦,与此同…

openHarmony添加system_basic权限安装报错

openHarmony添加system_basic权限安装报错 12/14 13:49:57: Install Failed: [Info]App install path:D:\huawei\project\FCTTest\entry\build\default\outputs\default\entry-default-signed.hap, queuesize:0, msg:error: failed to install bundle. error: install failed …

k8s常用命令及示例(三):apply 、edit、delete

k8s常用命令及示例(三):apply 、edit、delete 1. kubectl apply -f 命令:从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下:kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…

若依打包将vue放到.jar里面部署

1.vue静态文件,以及单页面 ruoyi-admin\src\main\resources\static \ruoyi-admin\src\main\resources\templates 2.后台开放白名单 "/cms", "/cms#/login" 3. mvc访问vue页面入口,接口 package com.ruoyi.web.controller.syst…

信号继电器 DX-31B DC220V 电压型 带板前接线底座

系列型号 DX-31B信号继电器DX-31BJ信号继电器 DX-32A信号继电器DX-32AJ信号继电器 DX-32B信号继电器DX-32BJ信号继电器 DX-31A信号继电器DX-33/1信号继电器 DX-33/2信号继电器DX-33/3信号继电器 DX-33/4信号继电器DX-33/5信号继电器 一. 继电器用途 DX-30系列信号继电器…

从池化的角度看GNN(包含PR-GNN,EdgePool等7篇论文)下篇

从池化的角度看GNN(包含PR-GNN,EdgePool等7篇论文)下篇 前言一些总结一些早期论文的简要介绍5️⃣论文StructPool:《StructPool: Structured Graph Pooling via Conditional Random Fields》6️⃣论文ASAP:《ASAP: Ada…

Kotlin 笔记 -- Kotlin 语言特性的理解(二)

都是编译成字节码,为什么 Kotlin 能支持 Java 中没有的特性? kotlin 有哪些 Java 中没有的特性: 类型推断、可变性、可空性自动拆装箱、泛型数组高阶函数、DSL顶层函数、扩展函数、内联函数伴生对象、数据类、密封类、单例类接口代理、inter…

Linux ed命令教程:如何使用ed命令编辑文本文件(附案例详解和注意事项)

Linux ed命令介绍 ed命令是Linux中的一个简单文本编辑器。它是一种基于行的文本编辑器,用于创建、修改和操作文本文件。它是Unix中最早的编辑器,后来被vi和emacs文本编辑器所取代。 Linux ed命令适用的Linux版本 ed命令在大多数Linux发行版中都可以使…

华为战略管理的核心工具与方法论:五看三定之“三定”定什么

上一篇文章,华研荟介绍了华为在战略管理中使用的工具之一:五看三定中的五看含义和主要的一些工具(模型),今天继续为您介绍“三定”。 在“五看”中,最后一看是“看机会”,将我们面临的各种可能…

[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity

文章目录 一、完整代码二、论文解读2.1 介绍2.2 Self-Attention is Low Rank2.3 模型架构2.4 结果 三、整体总结 论文:Linformer: Self-Attention with Linear Complexity 作者:Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma 时间&#…

Leetcode—1822.数组元素积的符号【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—1822.数组元素积的符号 实现代码 class Solution { public:int arraySign(vector<int>& nums) {int neg 0;for(int i 0; i < nums.size(); i) {if(nums[i] 0) {return 0;}if(nums[i] < 0) {neg;}}i…

机器人制作开源方案 | 智能助老机器人

作者&#xff1a;刘颖、王浩宇、党玉娟 单位&#xff1a;北京科技大学 指导老师&#xff1a;刘新洋、栗琳 1. 项目背景 1.1 行业背景 随着越来越多的服务机器人进入家庭&#xff0c;应用场景呈现多元化和专业化&#xff0c;机器人产业生态体系正在不断完善&#xff0c;服务…

亚马逊云科技发布企业生成式AI助手Amazon Q,助力企业迈向智能化时代

&#xff08;声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区、知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09; 一、前言 随着人工智能技术的快速发展和广泛应用&#xff0c;我们…

数据结构篇-双向循环链表

目录 一、学习目标 二、概念 节点设计&#xff1a; 节点初始化&#xff08;链表初始化&#xff09;&#xff1a; 节点头插&#xff1a; 插入数据的变形&#xff1a; 遍历显示&#xff1a; 有序插入&#xff1a; 四、总结 一、学习目标 知识点&#xff1a; 一文掌握数据…

芒果RT-DETR改进实验:深度集成版目标检测 RT-DETR 热力图来了!支持自定义数据集训练出来的模型

💡该教程为改进RT-DETR指南,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可💡更方便的统计更多实验数据,方便写作 芒果RT-DETR改进实验:深度集成版目标检测 RT-DETR 热力图来了!支持自定义数据集…

103基于matlab的极限学习机(ELM)和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机

基于matlab的极限学习机&#xff08;ELM&#xff09;和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机&#xff0c;该程序是三者的方法比对。 包括学习时间&#xff0c;训练精度和测试精度的对比。数据可更换自己 的&#xff0c;程序已调通&#xff0c;可直接运行…

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易&#xff0c;麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ ❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜&#xff01;献舞一支&#xff01;❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目录 9.13…

Ps:曲线的基本操作

在曲线上通过添加控制点&#xff0c;然后拖动或编辑这些控制点就可实现对图像的精细调整。 添加控制点 方法一&#xff1a; 直接在曲线上点击&#xff0c;即可添加控制点。 方法二&#xff1a; 使用目标调整工具时&#xff0c;在图像上单击&#xff0c;即可添加控制点。若按住并…

【重点】23.合并K个升序链表

题目 法1&#xff1a;分治合并 class Solution {public ListNode mergeKLists(ListNode[] lists) {return merge(lists, 0, lists.length - 1);}public ListNode merge(ListNode[] lists, int l, int r) {if (l > r) {return null;}if (l r) {return lists[l];}int mid l…