7  文本分析入门

点击下载本章节代码

7.1 Spacy 模型

安装依赖包

%pip install spacy wordcloud gensim pyLDAvis tqdm --upgrade

下载中文语言模型(3.8.0 版本)

%pip install https://github.com/explosion/spacy-models/releases/download/zh_core_web_md-3.8.0/zh_core_web_md-3.8.0-py3-none-any.whl

或使用命令行下载:

python -m spacy download zh_core_web_md

7.2 加载模型

import spacy
nlp = spacy.load("zh_core_web_md")
text = "暨南大学是中国第一所由政府创办的华侨学府。\
学校目前是中央统战部、教育部、广东省共建的国家“双一流”建设高校,直属中央统战部管理。"

print(text)
doc = nlp(text)
暨南大学是中国第一所由政府创办的华侨学府。学校目前是中央统战部、教育部、广东省共建的国家“双一流”建设高校,直属中央统战部管理。
for x in doc:
  print(x)
暨南
大学
是
中国
第一
所
由
政府
创办
的
华侨
学府
。
学校
目前
是
中央
统战部
、
教育部
、
广东省
共建
的
国家
“
双一流
”
建设
高校
,
直属
中央
统战部
管理
。
for i, sent in enumerate(doc.sents):
    print(i, sent)
0 暨南大学是中国第一所由政府创办的华侨学府。
1 学校目前是中央统战部、教育部、广东省共建的国家“双一流”建设高校,直属中央统战部管理。
for i, sent in enumerate(doc.sents):
  print(i, "-----")
  for x in sent:
    print(x)
0 -----
暨南
大学
是
中国
第一
所
由
政府
创办
的
华侨
学府
。
1 -----
学校
目前
是
中央
统战部
、
教育部
、
广东省
共建
的
国家
“
双一流
”
建设
高校
,
直属
中央
统战部
管理
。
token = doc[0]
print(token)
print(" 1", token.text)
print(" 2", token.ent_type_)
print(" 4", token.is_alpha)
print(" 5", token.is_space)
print(" 6", token.is_stop)
print(" 7", token.is_punct)
print(" 8", token.is_currency)
print(" 9", token.is_upper)
print("10", token.pos_) # Part of Speech
暨南
 1 暨南
 2 ORG
 4 True
 5 False
 6 False
 7 False
 8 False
 9 False
10 PROPN
def clean_text(text):
  text = "".join(text.split())
  doc = nlp(text)
  token_list = [token.text for token in doc if token.is_alpha and not token.is_stop]
  return " ".join(token_list)
clean_text("暨南大学是中国第一所由政府创办的华侨学府。")
'暨南 大学 中国 第一 政府 创办 华侨 学府'

自定义分词

proper_nouns = ['暨南大学','华侨学府']
nlp.tokenizer.pkuseg_update_user_dict(proper_nouns)
clean_text("暨南大学是中国第一所由政府创办的华侨学府。")
'暨南大学 中国 第一 政府 创办 华侨学府'

自定义stopwords

from spacy.lang.zh.stop_words import STOP_WORDS
#  set of Spacy's default stop words

for word in ["第一", "学府"]:
    STOP_WORDS.add(word) # 增加 stop words
    lexeme = nlp.vocab[word]
    lexeme.is_stop = True
clean_text("暨南大学是中国第一所由政府创办的华侨学府。")
'暨南大学 中国 政府 创办 华侨学府'
# 删除 stopwords
for word in ["第一", "学府", "是"]:
    STOP_WORDS.remove(word) # 剔除stop words
    lexeme = nlp.vocab[word]
    lexeme.is_stop = False
clean_text("暨南大学是中国第一所由政府创办的华侨学府。")
'暨南大学 是 中国 第一 政府 创办 华侨学府'

7.3 加载审计数据

import pandas as pd
df = pd.read_parquet(
    "https://ai4biz.oss-cn-guangzhou.aliyuncs.com/data/audit_descrpiption.parquet"
    )

df = df[df.year == 2023].sample(100)
df.head()
stkcd year audit_description
18395 603187 2023 海容冷链公司主营业务为商用冷链设备的研发、生产、销售和服务,主营业务收入为商用冷链设备产品销...
1954 931 2023 基于收入确认存在舞弊风险的假设,且营业收入是公司关键业绩指标之一,因此我们将收入确认认定为关...
22755 832419 2023 路斯股份主营宠物食品的生产销售,2023年度路斯股份营业务收入为69,631.32万元。由于...
2404 1979 2023 2023年12月31日,招商蛇口在合并财务报表中列报的存货账面余额为人民币423,445,7...
3020 2129 2023 TCL中环2023年度营业收入为59,146,463,192.95元,其中销售商品收入为56...

7.4 清洗文本

from tqdm.notebook import tqdm
tqdm.pandas()

df["audit_description_seg"] = df["audit_description"].progress_apply(clean_text)
df.audit_description_seg.str.len().describe()
count    100.000000
mean     183.770000
std       86.859442
min       54.000000
25%      127.750000
50%      159.500000
75%      216.750000
max      491.000000
Name: audit_description_seg, dtype: float64
df['n_words'] = df.audit_description_seg.apply(lambda x: len(x.split()))
df['n_words'].describe()
count    100.00000
mean      61.51000
std       28.89217
min       18.00000
25%       42.75000
50%       54.50000
75%       73.00000
max      164.00000
Name: n_words, dtype: float64

7.5 词频向量

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
cv = CountVectorizer(
    # max_features=1800,
    min_df=0.01, # lower
    max_df = 0.99,
    ngram_range=(1, 1)
)

word_count_vector = cv.fit_transform(df["audit_description_seg"].tolist())
word_count_vector
<Compressed Sparse Row sparse matrix of dtype 'int64'
    with 3507 stored elements and shape (100, 925)>
cv.get_feature_names_out()
array(['ac', 'led', 'mem', 'mems', 'odm', 'oem', 'pcb', 'poct', 's传',
       's声学传', 's惯性', 'tcl', '一时点', '三十', '三十九', '三十四', '三大', '上年', '上期',
       '上海', '下滑', '下降', '不尽相同', '不确定性', '专家', '世纪', '世龙', '业务', '业绩',
       '东峰', '东方', '个护', '中免', '中关村', '中国', '中环', '主导', '主机', '主营', '义务',
       '之中', '之间', '九州', '九州通', '书面', '买方', '予以', '事项', '二十九', '二十五',
       '二甲酰胺', '亏损', '云创', '云厂商', '互联网', '亚玛顿', '亚砜', '交付', '交接单', '交易',
       '交易性', '交易所', '交易量', '交给', '交货', '交通', '产出法', '产品', '人民币', '人造',
       '仕达', '付款', '以此', '仪器', '价值', '价款', '企业', '众多', '众成', '会计', '会计估',
       '传动', '传感器', '估计', '佐证', '体外', '体系', '余额', '作出', '佣金', '佳通', '使用者',
       '依赖', '信息', '信息化', '信用', '修复', '债务人', '假设', '偏向', '做出', '健康', '偶氮',
       '储能', '兆威机', '兆威机电', '光伏', '光储', '光电', '免税', '入账', '全球', '公允',
       '公共', '公司', '公用', '共创', '关注', '关系', '关联', '关联方', '关键', '具备', '内控',
       '内部', '内销', '军工', '农业', '农立华', '农药', '冰箱', '冶金', '冷链', '冻结', '净值',
       '净利润', '净额', '准确', '准确性', '减值', '减去', '减少', '减收', '凭证', '出具', '出口',
       '出库', '分为', '分布', '分散于', '分析', '分行', '分部', '分销', '分销商', '划分', '列康',
       '列报', '列示', '判断', '利息', '利扬', '利润', '利润率', '利润表', '利用', '利益', '到期',
       '制品', '制度', '制药', '制造', '制造业', '前瞻性', '办理', '功能性', '加工', '加盟商',
       '劳务', '包含', '包括', '包装', '化学', '化学品', '化工', '北玻', '区域', '医疗', '医药',
       '医院', '华信', '华正', '华能', '协议', '单个', '单价', '单据', '单时', '单独', '单证',
       '单项', '南京', '南药', '南裕', '南通', '占垒', '占年', '印制', '印刷', '印刷品', '厂商',
       '厂家', '历史', '压力', '压缩机', '原值', '原则', '原因', '原料', '参数', '参见', '参阅',
       '及子', '发出', '发展', '发放', '发泡剂', '发生', '发生额', '发电', '发祥', '发票', '发货',
       '发货单', '变现', '口岸', '口径', '可变', '可收', '可靠', '可靠性', '叶时', '叶烟标',
       '叶营业', '各异', '各类', '各项', '合同', '合并', '合并利', '合成', '合料', '合格', '合计',
       '合金', '同期', '后续', '告期', '咨询', '品类', '售价', '售后', '商业', '商品', '商检',
       '商用', '商砼', '商誉', '器械', '四十一', '四十七', '回函', '回性', '回执', '回报', '因素',
       '园林', '固定', '固有', '国内', '国外', '国投', '圣阳', '在内', '地区', '地点', '地纬',
       '坏账', '垒知', '垫款', '城交', '基础', '基础计', '基金', '塑料', '塑胶', '境内', '境外',
       '增长', '增长率', '处于', '处置', '复合', '复方', '外部', '外销', '多样', '多样性', '多种',
       '大且', '大众', '大地', '大地纬', '大型', '天宇', '天银机', '天马', '太阳能', '委托',
       '委聘', '子公司', '存储', '存放', '存款', '存续', '存货', '季度', '安世', '安全门', '安图',
       '安排', '安装', '安防', '完善', '完工', '完整', '完整性', '完毕', '宏观', '定制化', '定期',
       '实业', '实施', '宠物', '审核', '审计', '审验', '客户', '客观', '室内灯', '家具', '家居',
       '对价', '导热', '导致', '将征', '小错', '层于', '履约', '履行', '山大', '工业', '工业于',
       '工作', '工作量', '工程', '差异', '差异化', '己经', '已确', '市场', '市政', '带来', '年内',
       '年初', '年度', '年末', '年终', '并离港', '广信', '广汽', '库龄', '应收', '应计', '度山',
       '度桂', '度路斯', '度雅化', '康为', '康佳', '康恩贝', '康类', '延后', '建筑', '建设',
       '建造', '开具', '开发', '开山', '弹性体', '当日', '当期', '形式', '彩电', '影响', '征和',
       '待客', '微型', '德尔玛', '快递', '快速', '性且', '总收入', '总额', '恰当', '悦安', '情况',
       '惯例', '感器', '成品', '成本', '成果', '截止', '户验', '房产', '房地产', '房款', '所示',
       '所述', '手续', '手续费', '执行', '批发', '承运人', '投入', '投入法', '投资', '投资性',
       '折现', '折现率', '报关', '报关单', '报告', '报表', '披露', '招商', '持续', '持股', '指定',
       '指标', '损失', '损失率', '接受', '接收', '控制', '控制权', '控股', '提供', '提前', '提单',
       '提存', '提货', '提货单', '搅拌', '摊余', '撰写', '操控', '操纵', '支出', '收入', '收到',
       '收取', '收后', '收回', '收款', '收确', '收缩', '收货', '收货单', '收购', '政策', '敏芯',
       '数据', '数量', '整体', '文件', '新材', '新点', '新阳', '方及', '方式', '方法', '方确',
       '旅游', '无形', '无锡', '日期', '日间', '时段', '时点', '时间', '时间性', '昊华', '昌红',
       '明阳', '易德龙', '星宇', '显示', '普邦', '晶圆', '智慧', '智能', '智能化', '智能锁',
       '暂估', '暴露', '月末', '有限', '服务', '期内', '期望', '期末', '期货', '期间', '未来',
       '未计', '本期', '机构', '机械', '机械链', '机电', '机组', '杀菌剂', '权利', '权力', '材料',
       '条件', '条款', '来源', '来源于', '来自于', '板块', '标识', '树脂', '核心', '核算', '桂发',
       '桂发祥', '梦洁', '检测', '检验', '概率', '模具', '模型', '模式', '款及', '款项', '正确',
       '每日', '比例', '比重', '毛利', '毛利率', '民爆', '氛围灯', '氯化', '氯碱', '水健', '水平',
       '水电', '永安', '汇得', '汽车', '沙发', '沥青', '泓淋', '注释', '洁能', '津荣', '活动',
       '流入', '流动', '流量', '测试', '浙江', '浦东', '海关', '海容', '海洋', '涂料', '消费者',
       '涉及', '润表', '清洁', '清算', '渠道', '湖南', '湖南裕', '潜在', '激光', '烟标', '烟酒',
       '热塑性', '煤炭', '照明', '照灯', '燃气', '爱仕达', '物流', '特定', '特征', '特种', '状况',
       '状态', '独立', '王公司', '王力', '环保', '环境', '现值', '现金', '现金流', '玻璃', '生产',
       '生态', '生物', '用于', '甲醇', '申通', '电业', '电公司', '电力', '电子', '电气', '电池',
       '电源', '电站', '电营业', '电路', '电路板', '留存', '白电', '盈利', '盖章', '目标', '目的',
       '直线法', '直营', '直销', '相关', '相当于', '真实', '真实性', '石基', '研发', '确认',
       '磷酸', '祥龙', '离子', '离岸', '离港', '种类', '科华', '科技', '科远', '租金', '程序',
       '税费', '空置率', '第三方', '第十', '第四', '策略', '签发', '签字', '签定', '签收',
       '签收单', '签署', '简称', '算力', '管模', '管理', '管理层', '类别', '类型', '类链', '粉及',
       '粉末', '精华', '精品', '精密', '精密oa', '精细', '糕点', '系统', '红木', '约定', '纬报',
       '组件', '组可', '组合', '组合灯', '终了', '终端', '经济', '经纪', '经营', '经购', '经销',
       '经销商', '经验', '绩效', '维护类', '综合', '综合性', '绿化', '绿能', '编制', '美凯龙',
       '羰基', '耗材', '联域', '聘请', '聚氨酯', '肠炎宁', '股份', '能力', '能源', '膜类', '自产',
       '舞弊', '航天', '船运', '芯片', '苏州', '草合剂', '草坪', '药品', '获取', '营业', '营业务',
       '葡萄酒', '薄膜', '蛇口', '行业', '行车', '衡量', '表中', '表之', '表日', '装备', '装船',
       '裕能', '西子', '西高院', '规划', '规模', '视同', '角料', '计入', '计提', '计算', '计量',
       '认余', '认函', '认及', '认定', '认时', '记录', '记账', '设备', '设备链', '设施', '设计',
       '证券', '证据', '证明', '评估', '评级', '识别', '诊所', '诊断', '试剂', '该类', '详见',
       '误汇', '调整', '调节', '豪能', '负债', '财务', '账款', '账面', '货币', '货方', '货款',
       '货物', '货运', '质押', '质量', '购货方', '贷款', '贸易', '费用', '费用率', '资产',
       '资产组', '资料', '资本', '资源', '资质', '资金', '赛特', '趋势', '跌价', '路斯', '车型',
       '车灯', '车辆', '转入', '转移', '轮胎', '软件', '软磁粉', '辰光', '过程', '运抵', '运至',
       '运营', '运送', '近年', '还款', '进度', '违约', '迪马', '迹象', '送到', '通公司', '通合',
       '通知', '通裕', '通讯', '部件', '部品', '配套', '酒类', '采用', '里程', '重工', '重点',
       '重要性', '金叶', '金属', '金融', '金额', '钢化', '钢质', '钽业', '钽铌', '铁拓', '铁粉',
       '铁锂', '铅蓄', '铜板', '银行', '铸件', '销售', '销售予', '销售于', '销售额', '锂离子',
       '锅炉', '锐科', '错报', '锻件', '锻材', '长峰', '长期', '门店', '间隔', '闻泰', '阶段',
       '附注', '陆续', '陕西', '陕西金', '除草剂', '集团', '集成', '雪迪龙', '零件', '零售',
       '零售商', '雷达', '雾化', '雾灯', '霍普', '青稞', '非流动', '非贵', '非金属', '革用',
       '项目', '顾家', '顾家家', '预定', '预期', '预测', '预计', '领用', '频繁', '风险', '食品',
       '首期', '首药', '香化', '验收', '高端', '高者', '鱼腥', '麦澜德', '麻花', '鼎利', '齐鲁'],
      dtype=object)
word_count_vector.shape
(100, 925)
word_count_vector.toarray() # type: ignore
array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(100, 925))
word_tfidf_vector = TfidfTransformer().fit_transform(word_count_vector)
word_tfidf_vector
<Compressed Sparse Row sparse matrix of dtype 'float64'
    with 3507 stored elements and shape (100, 925)>
word_tfidf_vector.toarray() # type: ignore
array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]], shape=(100, 925))
word_count = pd.DataFrame(word_count_vector.toarray(), # type: ignore
                          columns = cv.get_feature_names_out(),
                          index = df['stkcd'])

word_count
ac led mem mems odm oem pcb poct s传 s声学传 ... 首药 香化 验收 高端 高者 鱼腥 麦澜德 麻花 鼎利 齐鲁
stkcd
603187 0 0 0 0 1 0 0 0 0 0 ... 0 0 1 0 0 0 0 0 0 0
931 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
832419 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1979 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2129 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
603809 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
688253 0 0 0 0 0 0 0 1 0 0 ... 0 0 0 0 0 0 0 0 0 0
600713 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
600470 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2403 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0

100 rows × 925 columns

基于词典的方法

word_count
ac led mem mems odm oem pcb poct s传 s声学传 ... 首药 香化 验收 高端 高者 鱼腥 麦澜德 麻花 鼎利 齐鲁
stkcd
603187 0 0 0 0 1 0 0 0 0 0 ... 0 0 1 0 0 0 0 0 0 0
931 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
832419 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1979 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2129 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
603809 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
688253 0 0 0 0 0 0 0 1 0 0 ... 0 0 0 0 0 0 0 0 0 0
600713 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
600470 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2403 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0

100 rows × 925 columns

wcdf = word_count.stack().reset_index()
wcdf
stkcd level_1 0
0 603187 ac 0
1 603187 led 0
2 603187 mem 0
3 603187 mems 0
4 603187 odm 1
... ... ... ...
92495 2403 鱼腥 0
92496 2403 麦澜德 0
92497 2403 麻花 0
92498 2403 鼎利 0
92499 2403 齐鲁 0

92500 rows × 3 columns

wcdf.columns = ["stkcd", "word", "N"]
wcdf = wcdf[wcdf.N > 0].sort_values(by=['stkcd', "N"]).reset_index(drop=True)
wcdf
stkcd word N
0 16 事项 1
1 16 光电 1
2 16 公司 1
3 16 关键 1
4 16 印刷 1
... ... ... ...
3502 873706 确认 3
3503 873706 公司 4
3504 873706 机械 4
3505 873706 铁拓 4
3506 873706 收入 5

3507 rows × 3 columns

7.6 词云

from wordcloud import WordCloud
wordclouddf = wcdf.groupby('word').N.sum().reset_index().sort_values(by='N', ascending=False).set_index('word')
wordclouddf
N
word
收入 493
确认 233
公司 191
关键 162
营业 155
... ...
建造 1
建设 1
康类 1
康佳 1
提货单 1

925 rows × 1 columns

worddic = wordclouddf["N"].to_dict()
worddic
{'收入': 493,
 '确认': 233,
 '公司': 191,
 '关键': 162,
 '营业': 155,
 '销售': 138,
 '审计': 103,
 '管理层': 100,
 '事项': 100,
 '年度': 78,
 '财务': 68,
 '业务': 66,
 '风险': 64,
 '指标': 63,
 '报表': 60,
 '产品': 54,
 '业绩': 52,
 '金额': 50,
 '固有': 47,
 '特定': 45,
 '股份': 44,
 '人民币': 44,
 '客户': 43,
 '目标': 42,
 '相关': 41,
 '识别': 39,
 '减值': 35,
 '资产': 35,
 '时点': 35,
 '预期': 31,
 '商品': 30,
 '恰当': 30,
 '操纵': 29,
 '合同': 29,
 '应收': 28,
 '影响': 27,
 '账款': 27,
 '商誉': 27,
 '合并': 27,
 '判断': 26,
 '简称': 26,
 '会计': 25,
 '期望': 25,
 '主营': 25,
 '附注': 22,
 '涉及': 22,
 '项目': 21,
 '服务': 21,
 '价值': 21,
 '估计': 20,
 '生产': 20,
 '账面': 20,
 '包括': 19,
 '测试': 19,
 '信用': 18,
 '评估': 17,
 '集团': 16,
 '计量': 16,
 '损失': 15,
 '比例': 15,
 '科技': 15,
 '成本': 15,
 '期间': 15,
 '约定': 15,
 '国内': 14,
 '经营': 13,
 '设备': 13,
 '控制权': 13,
 '错报': 13,
 '履约': 13,
 '收款': 13,
 '存货': 12,
 '来自于': 12,
 '工程': 12,
 '房地产': 12,
 '交付': 12,
 '交易': 12,
 '预计': 12,
 '报告': 12,
 '总额': 11,
 '坏账': 11,
 '政策': 11,
 '提供': 11,
 '收回': 11,
 '管理': 11,
 '出口': 11,
 '利润': 11,
 '新材': 11,
 '手续费': 10,
 '成果': 10,
 '研发': 10,
 '未来': 10,
 '系统': 9,
 '义务': 9,
 '设计': 9,
 '经济': 9,
 '余额': 9,
 '进度': 9,
 '报关': 9,
 '工业': 8,
 '方式': 8,
 '现金': 8,
 '资产组': 8,
 '计提': 8,
 '子公司': 8,
 '外销': 8,
 '银行': 8,
 '生物': 8,
 '检测': 8,
 '基础': 8,
 '医疗': 8,
 '检验': 8,
 '配套': 8,
 '利益': 8,
 '汇得': 8,
 '假设': 8,
 '流入': 8,
 '流量': 8,
 '投资性': 7,
 '收取': 7,
 '数据': 7,
 '市场': 7,
 '货物': 7,
 '固定': 7,
 '化工': 7,
 '医药': 7,
 '敏芯': 7,
 '履行': 7,
 '关联': 7,
 '有限': 7,
 '开发': 7,
 '公允': 7,
 '批发': 7,
 '包含': 6,
 '重要性': 6,
 '计入': 6,
 '大众': 6,
 '能源': 6,
 '转移': 6,
 '华正': 6,
 '所述': 6,
 '提单': 6,
 '苏州': 6,
 '模式': 6,
 '下降': 6,
 '照明': 6,
 '水电': 6,
 '信息': 6,
 '中国': 6,
 '来源': 6,
 '易德龙': 6,
 '潜在': 6,
 '签收': 6,
 '内销': 6,
 '冷链': 6,
 '详见': 6,
 '建筑': 5,
 '预测': 5,
 '华能': 5,
 '垫款': 5,
 '货款': 5,
 '圣阳': 5,
 '合计': 5,
 '通裕': 5,
 '减少': 5,
 '上海': 5,
 '上年': 5,
 '药品': 5,
 '发生': 5,
 '验收': 5,
 '外部': 5,
 '厂商': 5,
 '电源': 5,
 '发放': 5,
 '德尔玛': 5,
 '草坪': 5,
 '芯片': 5,
 '参数': 5,
 '南药': 5,
 '折现率': 5,
 '完工': 5,
 '材料': 5,
 '经纪': 5,
 '净值': 5,
 '收到': 5,
 '内部': 5,
 '无锡': 5,
 '公用': 5,
 '精密': 5,
 '期末': 5,
 '贷款': 5,
 '资金': 5,
 '跌价': 5,
 '完整性': 5,
 '认定': 5,
 '来源于': 5,
 '模型': 5,
 '装备': 5,
 '算力': 5,
 '重工': 5,
 '软件': 4,
 '广信': 4,
 '变现': 4,
 '发出': 4,
 '计算': 4,
 '地点': 4,
 '康恩贝': 4,
 '天宇': 4,
 '工作': 4,
 '西子': 4,
 '辰光': 4,
 '完整': 4,
 '可收': 4,
 '电路': 4,
 '增长率': 4,
 '回性': 4,
 '安防': 4,
 '因素': 4,
 '境外': 4,
 '货币': 4,
 '城交': 4,
 '调整': 4,
 '形式': 4,
 '利扬': 4,
 '铁拓': 4,
 '出具': 4,
 '收购': 4,
 '锅炉': 4,
 '方法': 4,
 '昌红': 4,
 '星宇': 4,
 '原则': 4,
 '陕西金': 4,
 '机械': 4,
 '集成': 4,
 '价款': 4,
 '洁能': 4,
 '津荣': 4,
 '海洋': 4,
 '中关村': 4,
 '真实': 4,
 '王力': 4,
 '现值': 4,
 '电池': 4,
 'mem': 4,
 '金融': 4,
 '光伏': 4,
 '控制': 4,
 '制品': 4,
 '航天': 4,
 '单时': 4,
 '联域': 4,
 '采用': 4,
 '报关单': 4,
 '加盟商': 4,
 '投资': 4,
 '整体': 3,
 '诊断': 3,
 '西高院': 3,
 '聚氨酯': 3,
 '海容': 3,
 '执行': 3,
 '离港': 3,
 '润表': 3,
 '清洁': 3,
 '激光': 3,
 '经销商': 3,
 '烟标': 3,
 '能力': 3,
 '王公司': 3,
 '新阳': 3,
 '感器': 3,
 '环保': 3,
 '环境': 3,
 '情况': 3,
 '太阳能': 3,
 '玻璃': 3,
 '目的': 3,
 '电力': 3,
 '总收入': 3,
 '电站': 3,
 '综合': 3,
 '安图': 3,
 '安装': 3,
 '注释': 3,
 '汽车': 3,
 '数量': 3,
 '装船': 3,
 '对价': 3,
 '家居': 3,
 '旅游': 3,
 '时间': 3,
 '美凯龙': 3,
 '披露': 3,
 '接受': 3,
 '智慧': 3,
 '期内': 3,
 '实业': 3,
 '设施': 3,
 '期货': 3,
 '接收': 3,
 '本期': 3,
 '表中': 3,
 '权利': 3,
 '权力': 3,
 '经销': 3,
 '控股': 3,
 '模具': 3,
 '款项': 3,
 '齐鲁': 3,
 '试剂': 3,
 '凭证': 3,
 '亚玛顿': 3,
 '发祥': 3,
 '光电': 3,
 '长峰': 3,
 '转入': 3,
 '阶段': 3,
 '佣金': 3,
 '传感器': 3,
 '传动': 3,
 '雪迪龙': 3,
 '众多': 3,
 '赛特': 3,
 '零售': 3,
 '合并利': 3,
 '仕达': 3,
 '交易所': 3,
 '发电': 3,
 '入账': 3,
 '锐科': 3,
 '准确性': 3,
 '制造': 3,
 '华信': 3,
 '通讯': 3,
 '列示': 3,
 '钽业': 3,
 '减去': 3,
 '违约': 3,
 '过程': 3,
 '准确': 3,
 '农立华': 3,
 '关联方': 3,
 '原值': 3,
 '关注': 3,
 '参见': 3,
 '咨询': 3,
 '路斯': 3,
 '东方': 3,
 '商砼': 3,
 '中免': 3,
 '世纪': 3,
 '中环': 3,
 '主机': 3,
 '不确定性': 3,
 '一时点': 3,
 'tcl': 3,
 '九州': 3,
 '费用': 3,
 '之间': 3,
 '世龙': 3,
 '商用': 3,
 '专家': 2,
 '状态': 2,
 '终端': 2,
 '终了': 2,
 '制药': 2,
 '鼎利': 2,
 '关系': 2,
 '相当于': 2,
 '日期': 2,
 '利润表': 2,
 '时段': 2,
 '招商': 2,
 '办理': 2,
 '真实性': 2,
 '共创': 2,
 '石基': 2,
 '销售予': 2,
 '麦澜德': 2,
 '净额': 2,
 '损失率': 2,
 's传': 2,
 '绿能': 2,
 '钢质': 2,
 '绿化': 2,
 '高者': 2,
 '分部': 2,
 '出库': 2,
 '减收': 2,
 '利用': 2,
 '生态': 2,
 '到期': 2,
 '昊华': 2,
 '收货': 2,
 '高端': 2,
 'oem': 2,
 '净利润': 2,
 '革用': 2,
 '燃气': 2,
 '九州通': 2,
 '消费者': 2,
 '付款': 2,
 '梦洁': 2,
 '顾家家': 2,
 '海关': 2,
 '零售商': 2,
 '交通': 2,
 '交货': 2,
 '毛利率': 2,
 '民爆': 2,
 '交易性': 2,
 '永安': 2,
 '二十九': 2,
 '科远': 2,
 '泓淋': 2,
 '非流动': 2,
 '云创': 2,
 '仪器': 2,
 '条款': 2,
 '明阳': 2,
 '劳务': 2,
 '领用': 2,
 '流动': 2,
 '长期': 2,
 '智能化': 2,
 '精细': 2,
 '暂估': 2,
 '闻泰': 2,
 '做出': 2,
 '修复': 2,
 '依赖': 2,
 '湖南': 2,
 '精华': 2,
 '作出': 2,
 '类链': 2,
 '类型': 2,
 '体外': 2,
 '清算': 2,
 '里程': 2,
 '电路板': 2,
 '包装': 2,
 '年内': 2,
 '后续': 2,
 '同期': 2,
 '资本': 2,
 '合格': 2,
 '工作量': 2,
 '差异': 2,
 '规模': 2,
 '规划': 2,
 '化学': 2,
 '裕能': 2,
 '售后': 2,
 '年末': 2,
 '车型': 2,
 '可靠': 2,
 '广汽': 2,
 '口径': 2,
 '衡量': 2,
 '蛇口': 2,
 '延后': 2,
 '发货': 2,
 '售价': 2,
 '器械': 2,
 '原料': 2,
 '基金': 2,
 '负债': 2,
 '天马': 2,
 '复合': 2,
 '委托': 2,
 '处置': 2,
 '增长': 2,
 '境内': 2,
 '诊所': 2,
 '存续': 2,
 '评级': 2,
 '购货方': 2,
 '垒知': 2,
 '安全门': 2,
 '地区': 2,
 '证明': 2,
 '国投': 2,
 '证据': 2,
 '园林': 2,
 '完毕': 2,
 '证券': 2,
 '开山': 2,
 '叶烟标': 2,
 '悦安': 2,
 '南通': 2,
 '运营': 2,
 '医院': 2,
 '部品': 2,
 '酒类': 2,
 '北玻': 2,
 '手续': 2,
 '通知': 2,
 '截止': 2,
 '所示': 2,
 '房产': 2,
 '通公司': 2,
 '维护类': 1,
 '记账': 1,
 '设备链': 1,
 '综合性': 1,
 '离岸': 1,
 '预定': 1,
 '绩效': 1,
 '顾家': 1,
 '质量': 1,
 '贸易': 1,
 '组合灯': 1,
 '种类': 1,
 '离子': 1,
 '程序': 1,
 '资料': 1,
 '霍普': 1,
 '青稞': 1,
 '租金': 1,
 '认余': 1,
 '认函': 1,
 '钽铌': 1,
 '经验': 1,
 '非贵': 1,
 '认及': 1,
 '非金属': 1,
 '费用率': 1,
 '认时': 1,
 '记录': 1,
 '科华': 1,
 '祥龙': 1,
 '通合': 1,
 '香化': 1,
 '豪能': 1,
 '麻花': 1,
 '耗材': 1,
 '留存': 1,
 '白电': 1,
 '该类': 1,
 '盈利': 1,
 '盖章': 1,
 '鱼腥': 1,
 '重点': 1,
 '直线法': 1,
 '羰基': 1,
 '编制': 1,
 '直营': 1,
 '首药': 1,
 '质押': 1,
 '首期': 1,
 '食品': 1,
 '频繁': 1,
 '直销': 1,
 '金叶': 1,
 '货方': 1,
 '聘请': 1,
 '部件': 1,
 '金属': 1,
 '钢化': 1,
 '货运': 1,
 '磷酸': 1,
 '空置率': 1,
 '肠炎宁': 1,
 '税费': 1,
 '铁粉': 1,
 '第三方': 1,
 '第十': 1,
 '销售于': 1,
 '膜类': 1,
 '糕点': 1,
 '葡萄酒': 1,
 '薄膜': 1,
 '精密oa': 1,
 '门店': 1,
 '间隔': 1,
 '行业': 1,
 '行车': 1,
 '运送': 1,
 '车辆': 1,
 '陆续': 1,
 '表之': 1,
 '陕西': 1,
 '红木': 1,
 '锻材': 1,
 '营业务': 1,
 '组件': 1,
 '舞弊': 1,
 '组合': 1,
 '运至': 1,
 '组可': 1,
 '船运': 1,
 '运抵': 1,
 '销售额': 1,
 '锻件': 1,
 '草合剂': 1,
 '软磁粉': 1,
 '纬报': 1,
 '轮胎': 1,
 '自产': 1,
 '获取': 1,
 '精品': 1,
 '铸件': 1,
 '表日': 1,
 '雾灯': 1,
 '资质': 1,
 '雷达': 1,
 '角料': 1,
 '资源': 1,
 '雾化': 1,
 '签定': 1,
 '签字': 1,
 '经购': 1,
 '签发': 1,
 '铅蓄': 1,
 '策略': 1,
 '第四': 1,
 '铁锂': 1,
 '锂离子': 1,
 '铜板': 1,
 '签收单': 1,
 '近年': 1,
 '类别': 1,
 '粉末': 1,
 '粉及': 1,
 '车灯': 1,
 '除草剂': 1,
 '还款': 1,
 '迪马': 1,
 '迹象': 1,
 '签署': 1,
 '送到': 1,
 '趋势': 1,
 '零件': 1,
 '误汇': 1,
 '管模': 1,
 '视同': 1,
 '调节': 1,
 'ac': 1,
 '电营业': 1,
 '原因': 1,
 '印刷': 1,
 '印刷品': 1,
 '厂家': 1,
 '历史': 1,
 '压力': 1,
 '压缩机': 1,
 '参阅': 1,
 '占年': 1,
 '及子': 1,
 '发展': 1,
 '发泡剂': 1,
 '发生额': 1,
 '发票': 1,
 '发货单': 1,
 '印制': 1,
 '占垒': 1,
 '可变': 1,
 '协议': 1,
 '制造业': 1,
 '前瞻性': 1,
 '功能性': 1,
 '加工': 1,
 '化学品': 1,
 '区域': 1,
 '单个': 1,
 '南裕': 1,
 '单价': 1,
 '单据': 1,
 '单独': 1,
 '单证': 1,
 '单项': 1,
 '南京': 1,
 '口岸': 1,
 '可靠性': 1,
 '利润率': 1,
 '多样': 1,
 '地纬': 1,
 '基础计': 1,
 '塑料': 1,
 '塑胶': 1,
 '处于': 1,
 '复方': 1,
 '多样性': 1,
 '国外': 1,
 '多种': 1,
 '大且': 1,
 '大地': 1,
 '大地纬': 1,
 '大型': 1,
 '天银机': 1,
 '在内': 1,
 '回报': 1,
 '叶时': 1,
 '合金': 1,
 '叶营业': 1,
 '各异': 1,
 '各类': 1,
 '各项': 1,
 '合成': 1,
 '合料': 1,
 '告期': 1,
 '回执': 1,
 '品类': 1,
 '商业': 1,
 '商检': 1,
 '四十一': 1,
 '四十七': 1,
 '回函': 1,
 '制度': 1,
 '利息': 1,
 '电气': 1,
 '互联网': 1,
 '买方': 1,
 '予以': 1,
 '二十五': 1,
 '二甲酰胺': 1,
 '亏损': 1,
 '云厂商': 1,
 '亚砜': 1,
 '之中': 1,
 '交接单': 1,
 '交易量': 1,
 '交给': 1,
 '产出法': 1,
 '人造': 1,
 '以此': 1,
 '书面': 1,
 '主导': 1,
 '众成': 1,
 '三十': 1,
 'mems': 1,
 'odm': 1,
 'pcb': 1,
 'poct': 1,
 's声学传': 1,
 's惯性': 1,
 '三十九': 1,
 '个护': 1,
 '三十四': 1,
 '三大': 1,
 '上期': 1,
 '下滑': 1,
 '不尽相同': 1,
 '东峰': 1,
 '企业': 1,
 '会计估': 1,
 '列报': 1,
 '分布': 1,
 '农业': 1,
 '农药': 1,
 '冰箱': 1,
 '冶金': 1,
 '冻结': 1,
 '分为': 1,
 '分散于': 1,
 '内控': 1,
 '分析': 1,
 '分行': 1,
 '分销': 1,
 '分销商': 1,
 '划分': 1,
 '列康': 1,
 '军工': 1,
 '具备': 1,
 '佐证': 1,
 '健康': 1,
 '体系': 1,
 '佳通': 1,
 '使用者': 1,
 '信息化': 1,
 '债务人': 1,
 '偏向': 1,
 '偶氮': 1,
 '公共': 1,
 '储能': 1,
 '兆威机': 1,
 '兆威机电': 1,
 '光储': 1,
 '免税': 1,
 '全球': 1,
 '委聘': 1,
 '存储': 1,
 '存放': 1,
 '条件': 1,
 '未计': 1,
 '机构': 1,
 '机械链': 1,
 '机电': 1,
 '机组': 1,
 '杀菌剂': 1,
 '板块': 1,
 '暴露': 1,
 '标识': 1,
 '树脂': 1,
 '核心': 1,
 '核算': 1,
 '桂发': 1,
 '桂发祥': 1,
 '月末': 1,
 '智能锁': 1,
 '款及': 1,
 '方及': 1,
 '收后': 1,
 '收确': 1,
 '收缩': 1,
 '收货单': 1,
 '文件': 1,
 '新点': 1,
 '方确': 1,
 '智能': 1,
 '无形': 1,
 '日间': 1,
 '时间性': 1,
 '显示': 1,
 '普邦': 1,
 '晶圆': 1,
 '概率': 1,
 '正确': 1,
 '存款': 1,
 '独立': 1,
 '照灯': 1,
 '爱仕达': 1,
 '物流': 1,
 '特征': 1,
 '特种': 1,
 '状况': 1,
 '现金流': 1,
 '热塑性': 1,
 '用于': 1,
 '甲醇': 1,
 '申通': 1,
 '电业': 1,
 '电公司': 1,
 '电子': 1,
 '煤炭': 1,
 '烟酒': 1,
 '每日': 1,
 '水平': 1,
 '比重': 1,
 '毛利': 1,
 '氛围灯': 1,
 '氯化': 1,
 '氯碱': 1,
 '水健': 1,
 '沙发': 1,
 '湖南裕': 1,
 '沥青': 1,
 '活动': 1,
 '浙江': 1,
 '浦东': 1,
 '涂料': 1,
 '渠道': 1,
 '支出': 1,
 '操控': 1,
 '撰写': 1,
 '市政': 1,
 '层于': 1,
 '山大': 1,
 '工业于': 1,
 '差异化': 1,
 '己经': 1,
 '已确': 1,
 '带来': 1,
 '将征': 1,
 '年初': 1,
 '年终': 1,
 '并离港': 1,
 '库龄': 1,
 '应计': 1,
 '度山': 1,
 '小错': 1,
 '导致': 1,
 '摊余': 1,
 '定期': 1,
 '季度': 1,
 '安世': 1,
 '安排': 1,
 '完善': 1,
 '宏观': 1,
 '定制化': 1,
 '实施': 1,
 '导热': 1,
 '宠物': 1,
 '审核': 1,
 '审验': 1,
 '客观': 1,
 '室内灯': 1,
 '家具': 1,
 '度桂': 1,
 '度路斯': 1,
 '度雅化': 1,
 '持续': 1,
 '户验': 1,
 '房款': 1,
 '承运人': 1,
 '投入': 1,
 '投入法': 1,
 '折现': 1,
 '持股': 1,
 '康为': 1,
 '指定': 1,
 '提前': 1,
 '提存': 1,
 '提货': 1,
 'led': 1,
 '搅拌': 1,
 '成品': 1,
 '惯例': 1,
 '性且': 1,
 '快速': 1,
 '快递': 1,
 '微型': 1,
 '待客': 1,
 '征和': 1,
 '彩电': 1,
 '当期': 1,
 '当日': 1,
 '弹性体': 1,
 '开具': 1,
 '建造': 1,
 '建设': 1,
 '康类': 1,
 '康佳': 1,
 '提货单': 1}

open source font: https://fonts.google.com/

wordcloud = WordCloud(font_path="data/canger03-W03.ttf",
                      background_color="white", max_words=100,
                   max_font_size=250, random_state=42, width=1200,
                      height=600, margin=2).generate_from_frequencies(worddic)
import matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

wordcloud = WordCloud(font_path="data/MaShanZheng-Regular.ttf",
                      background_color="white", max_words=100,
                   max_font_size=250, random_state=42, width=1200,
                      height=600, margin=2).generate_from_frequencies(worddic)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

7.7 词表占比

total = wcdf.groupby("stkcd").N.sum().reset_index().rename(columns = {"N":"total"})
total.head()
stkcd total
0 16 37
1 812 43
2 931 110
3 962 43
4 1326 57
# define your own word list
wordlist = ["收入"]
wordlistN = wcdf[wcdf.word.isin(wordlist)].groupby("stkcd").N.sum().reset_index().rename(columns = {"N":"listN"})
wordlistN
stkcd listN
0 16 5
1 812 6
2 931 11
3 962 5
4 1326 8
... ... ...
79 688786 6
80 830832 4
81 832419 4
82 835305 4
83 873706 5

84 rows × 2 columns

wordlistN = total.merge(wordlistN, how="left", on = "stkcd").fillna(0)
wordlistN
stkcd total listN
0 16 37 5.0
1 812 43 6.0
2 931 110 11.0
3 962 43 5.0
4 1326 57 8.0
... ... ... ...
95 688786 46 6.0
96 830832 30 4.0
97 832419 37 4.0
98 835305 30 4.0
99 873706 51 5.0

100 rows × 3 columns

wordlistN['wordrate'] = wordlistN["listN"]/wordlistN["total"]
wordlistN.head()
stkcd total listN wordrate
0 16 37 5.0 0.135135
1 812 43 6.0 0.139535
2 931 110 11.0 0.100000
3 962 43 5.0 0.116279
4 1326 57 8.0 0.140351
wordlistN.wordrate.hist(bins = 30)

wordlistN.to_excel("data/wordlist_ratio.xlsx", index = False)
wordlistN = wordlistN.assign(sentiment = wordlistN["listN"]/wordlistN["total"])
wordlistN.query("sentiment < 0")
stkcd total listN wordrate sentiment
wordlistN.sentiment.describe()
count    100.000000
mean       0.092512
std        0.053844
min        0.000000
25%        0.065117
50%        0.103807
75%        0.131579
max        0.216216
Name: sentiment, dtype: float64
wordlistN.sentiment.hist(bins = 30)

7.8 相似度

from sklearn.metrics.pairwise import cosine_similarity
xx = cosine_similarity(word_tfidf_vector)
xx.shape
(100, 100)
pd.DataFrame(xx, columns =  df.stkcd,
                          index = df.stkcd)
stkcd 603187 931 832419 1979 2129 301358 601799 2613 300534 2534 ... 600635 301439 601828 2235 600927 603809 688253 600713 600470 2403
stkcd
603187 1.000000 0.167584 0.113731 0.008939 0.173045 0.156784 0.115798 0.217959 0.013216 0.221886 ... 0.034476 0.011193 0.023704 0.293223 0.200799 0.028194 0.294775 0.114109 0.221747 0.187433
931 0.167584 1.000000 0.112956 0.067193 0.148211 0.146388 0.126210 0.223557 0.419844 0.127400 ... 0.046462 0.357577 0.052371 0.158540 0.161226 0.065717 0.288937 0.124363 0.186754 0.146140
832419 0.113731 0.112956 1.000000 0.013887 0.090895 0.139436 0.273977 0.219290 0.021697 0.100324 ... 0.009397 0.031224 0.020217 0.120435 0.091044 0.061854 0.178455 0.122167 0.154182 0.403971
1979 0.008939 0.067193 0.013887 1.000000 0.005188 0.014189 0.028186 0.069576 0.075037 0.016664 ... 0.049443 0.081832 0.015513 0.009431 0.008648 0.089771 0.134177 0.012197 0.055184 0.024220
2129 0.173045 0.148211 0.090895 0.005188 1.000000 0.138064 0.085191 0.113501 0.009252 0.211211 ... 0.013245 0.024480 0.016306 0.172541 0.154484 0.030792 0.171025 0.197277 0.248690 0.192533
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
603809 0.028194 0.065717 0.061854 0.089771 0.030792 0.037761 0.056323 0.099390 0.195091 0.022888 ... 0.041523 0.132959 0.089851 0.041131 0.032410 1.000000 0.082663 0.022828 0.041520 0.064072
688253 0.294775 0.288937 0.178455 0.134177 0.171025 0.295459 0.225621 0.427863 0.057229 0.207406 ... 0.099745 0.091795 0.038926 0.333424 0.193159 0.082663 1.000000 0.139787 0.348300 0.222467
600713 0.114109 0.124363 0.122167 0.012197 0.197277 0.129114 0.102265 0.120938 0.014124 0.149972 ... 0.035397 0.019096 0.020657 0.132252 0.109137 0.022828 0.139787 1.000000 0.194644 0.184997
600470 0.221747 0.186754 0.154182 0.055184 0.248690 0.198371 0.151330 0.206756 0.018119 0.269614 ... 0.056122 0.036087 0.014589 0.210972 0.181524 0.041520 0.348300 0.194644 1.000000 0.260663
2403 0.187433 0.146140 0.403971 0.024220 0.192533 0.149679 0.303180 0.234446 0.017734 0.150085 ... 0.011128 0.026554 0.012724 0.164467 0.143334 0.064072 0.222467 0.184997 0.260663 1.000000

100 rows × 100 columns

simi_pair = pd.DataFrame(xx, columns =  df.stkcd, index = df.stkcd).stack()
simi_pair
stkcd   stkcd 
603187  603187    1.000000
        931       0.167584
        832419    0.113731
        1979      0.008939
        2129      0.173045
                    ...   
2403    603809    0.064072
        688253    0.222467
        600713    0.184997
        600470    0.260663
        2403      1.000000
Length: 10000, dtype: float64
simi_pair.index.names = ['stkcd_x', 'stkcd_y']
simi_pair.reset_index().rename(columns = {0: "similarity"})
stkcd_x stkcd_y similarity
0 603187 603187 1.000000
1 603187 931 0.167584
2 603187 832419 0.113731
3 603187 1979 0.008939
4 603187 2129 0.173045
... ... ... ...
9995 2403 603809 0.064072
9996 2403 688253 0.222467
9997 2403 600713 0.184997
9998 2403 600470 0.260663
9999 2403 2403 1.000000

10000 rows × 3 columns