? ?? ?当涉及到文本数据处理和可视化的任务时,我们可以通过了解下面的知识和使用Python的一些主要库和工具来完成这些任务。
? ?? ?包括读取文本文件、对文本进行分词、去除停用词等基本文本处理步骤。
with open('filename.txt', 'r', encoding='utf-8') as file:
text_data = file.read()
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]
? ?? ?通过词云制作实现文本数据的可视化呈现。
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
库生成词云图的过程主要分为以下几个步骤:
安装 wordcloud
库:
? ?? ?在命令行或终端中运行以下命令安装 wordcloud
:
pip install wordcloud
导入库:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
准备文本数据:
? ?? ?获取需要生成词云的文本数据,确保文本数据是字符串形式。
创建 WordCloud
对象并生成词云:
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text_data)
? ?? ?在这里,我们创建了一个 WordCloud
对象,指定了词云的宽度、高度和背景颜色。可以根据需要调整其他参数,比如字体、最大词汇量等。
可选步骤 - 自定义词云形状:
? ?? ?如果你想要词云的形状为特定图形,可以使用自定义形状的图片。首先,你需要准备一张形状的图片,然后使用 WordCloud
的 mask
参数指定该图片。
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)
显示或保存词云图:
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
方法保存生成的词云图。
? ?? ?可看Python专栏
? ?? ?要求通过Python实现上述功能,因此需要熟悉Python编程语言及其相关库和模块。
? ?? ?对文本中各个词汇的出现频率进行统计分析。
from collections import Counter
word_freq = Counter(filtered_words)
? ?? ?从文本中提取人物名称,这可能需要使用一些自然语言处理(NLP)的技术或者规则来实现。
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']
? ?? ?将文本划分成自然段,可能涉及到对文本的分段或分句处理。
import re
paragraphs = re.split('\n\n', text_data)
? ?? ?分析文本中人物出现的频率分布情况,可以通过统计每个人物在文本中出现的次数来实现。
character_freq = Counter(person_names)
? ?? ?使用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()
? ?? ? 文本分析所用小说(数据)
主要步骤如下:
? ?? ?下载一篇纯英文小说,保存为txt文档。
? ?? ?打开小说文件,通过对字符串的处理(注意统计中要去掉各种标点符号,除英文以外的内容。),统计小说中所有英文单词的使用频次,结果保存在一个字典中。
? ?? ?对字典中的数据进行排序,按照使用频次从高到低进行排序,并把统计结果写到一个文本文件中。
? ?? ?把单词的使用频次的信息用词云的方式显示出来。
小说文件截图(处理小说源文件):
代码截图:
运行结果(词云):
生成词典并排序截图:
? ?? ?对于中文小说的词频统计、人名提取、自然段划分和人物出现频率分布分析,并利用wordcloud模块生成词云图。
主要步骤如下:
? ?? ?下载一篇中文小说,字数在十万字以上。使用中文分词库进行分词。统计使用最多的人名和中文词汇并输出。
? ?? ?列出小说中的主要人物,包括主人公,以及另外相关人物5人或以上。
? ?? ?把小说分段,分析出小说一共有多少自然段。并统计出上面列出的人物共在多少个自然段中出现。并用某种输出模式体现出这种分布情况,例如在第一段出现,输出一个字符,在第二段没有出现,输出一个空格。可以直观的看出人物出现的位置和频率。
? ?? ?分析主人公以及其他相关人物之间的亲密度,两个人在同一个自然段同时出现亲密度加1,最后得到统计结果。
? ?? ?把词频的统计结果用词云的方式显示出来。
小说原文件截图(处理小说源文件):
代码截图:
运行结果(词云):
段落数截图:
细节:
人物出现频率截图
主角(阿龙纳斯):
配角1(康赛尔):
配角2(尼德?兰):
配角3(尼摩船长):
配角4(何伯逊敬启):
配角5(教授):
亲密度:
操作异常:在使用中文分词库jieba
时,可能会遇到编码问题,导致分词不准确。
解决方案:在打开和处理文件时,使用正确的编码格式进行操作。可以尝试使用UTF-8编码,因为它在处理中文文本时通常表现良好。
操作异常:在使用wordcloud
模块时,可能由于依赖 matplotlib 和 NumPy 的安装问题而导致出现ImportError。
解决方案:可以尝试重新安装matplotlib
和numpy
模块,或者在虚拟环境中安装这些模块,以解决依赖库安装问题。
异常问题:处理中文小说时候,因为没有安装Python和jieba分词库代码无法运行。
解决方案:使用以下命令安装jieba:pip install jieba
异常问题:在处理英文小说时,代码中使用了nltk库和wordcloud库,但是用户没有提前安装这两个库,导致代码运行时报错。
解决方案:用户在运行代码前应该使用以下命令安装所需的库:pip install nltk
和pip install wordcloud
操作异常:因为没有设置中文字体路径词云图无法读出中文。
解决方案:下载该文件并加入代码font_path = 'zitiaozichangyinghedianshan.ttf # 设置中文字体路径
#英文小说单词使用频次统计和词云制作:
# 导入需要的库
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()
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)