python-3.x - 余弦相似度图混杂在一起的名字
问题描述
我有一小部分文档,我正在为其绘制余弦相似度。文档名称很长,我不知道如何防止它们在情节上一起运行。以下是文件名的样子:
['0-W909MY17R0016',
'10 ID04160056 TOR 3.17.17',
'ENVG',
'FA5270-14-R-0027',
'GSS',
'H9240819R0001_1Oct19',
'LCLSC16R0005',
'LTLMII RFPFINALRELEASED',
'N00019-15-R-2004',
'N0010418RK032_for_PR_N0010418NB058',
'N00164-16-R-JQ94_RFP',
'N0025319R0001',
'N6134019R0007_RFP',
'N66604-18-R-0881_Conformed_Through_Amendment_0006',
'NGLD_M_Draft_RFP_Final (3)',
'SOL-615-16-000001_-PLSO_SOL',
'SPRDL115R0414_0000',
'W15QKN-18-R-0065_-_MMO',
'W58RGZ-17-R-0211',
'W912P618B0009_FB_FAC_SUPPORT_SVCS-_FBO',
'W91CRB17R0004_STORM_II',
'Full_Project_Announcement_RIK-OTA-F16EW_03_Jan_2019',
'MQ-25 Final RFP N00019-17-R-0087',
'Solicitation N00421-18-R-0091 - Enhanced Visual Acuity (EVA)']
我在文档之间做了一个基本的余弦距离:
from sklearn.metrics.pairwise import cosine_distances
cos_distances = cosine_distances(dtm)
mds_map = MDS(dissimilarity='precomputed')
pos = mds_map.fit_transform(cos_distances)
还有一个基本的 matplotlib 散点图:
#pos contains the x and y coordinates of each of the documents
x = pos[:,0]
y = pos[:,1]
#we will need matplotlib to generate a scatter plot
import matplotlib.pyplot as plt
for i, j, name in zip(x,y,files):
plt.scatter(i,j)
plt.text(i,j,name)
plt.show()
看起来像这样:
我很难找到专门处理这个问题的文档。
解决方案
您可以使用不同的颜色和/或标记绘制每个点,并创建一个图例以放置在可以显示文件名的绘图之外:
import numpy as np
import matplotlib.pyplot as plt
# Random 2D points to make scatter plot
x = [np.random.random() for i in range(len(names))]
y = [np.random.random() for i in range(len(names))]
fig = plt.figure(figsize=(20, 8))
ax = plt.subplot(111)
如果您不想手动为每个文件名分配颜色,可以将 pyplot 颜色图映射到颜色列表并在散点图中使用它:
colors = plt.cm.rainbow(np.linspace(0, 1, len(names)))
for i, j, name in zip(x, y, names):
ax.scatter(i, j, label=name, c=colors[names.index(name)])
fig.subplots_adjust(right=0.6) # This is needed so that the legend is not cut out of the figure
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=12)
plt.show()
您可以使用该bbox_to_anchor
参数来移动图例。
如果您想分配单独的颜色或标记,我能想到的唯一方法是创建一个字典。例如:
colors = plt.cm.rainbow(np.linspace(0, 1, len(names)))
plot_names = {'0-W909MY17R0016': [colors[0], 'o'],
'10 ID04160056 TOR 3.17.17': [colors[1], 'x'],
'ENVG': [colors[2], '*'],
'FA5270-14-R-0027': [colors[3], '^']}
for i, j, name in zip(x, y, names):
ax.scatter(i, j, label=name, c=plot_names[name][0], marker=plot_names[name][1])
fig.subplots_adjust(right=0.6)
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=12)
plt.show()
您可以在此处查看所有可用的标记。您还可以更改它们的大小、边框等。
推荐阅读
- r - R索引数字(0)而不是0
- c# - 为什么我的 mvc 项目重定向到默认的 403 错误页面,而不是我重定向到的页面,而不是在本地的 IIS 上?
- laravel - 获取值的动态分页
- typescript - 创建一个允许设置类成员的类成员函数
- azure - ServiceBus 重试策略不适用于 QueueClient
- css - Elementor 不同的背景颜色
- php - Google Invisible reCaptcha 不会阻止垃圾邮件提交
- javascript - [routerLink]="" VS href="javascript:void(0);"
- javascript - 如何在 JavaScript 的回调中调用打字稿函数
- android - 如何在android上制作自动压脚?