通过 Python 中的 NLP 实现 SIC 行业相似性
通过 Python 中的 NLP 实现 SIC 行业相似性
金融机构早就知道 碳化硅行业 分类。在本文中,我使用余弦相似度 NLP 算法的两种不同实现来缓解此结果。本研究的最终结果为所有 SIC 行业生成了一个相似矩阵。
与所有 ML 项目一样,我们需要对数据进行预处理。您可以从我的网站下载 IndustryGrouping.csv 数据集 github 仓库 .您还需要下载任何丢失的软件包。我使用 anaconda 并从 这里 与所有其他人一起。如果您使用 anaconda,请不要使用 pip。
将熊猫导入为 pd
从 nltk.corpus 导入停用词
从 nltk 导入下载
将 numpy 导入为 np
IndustrySet = pd.read_csv("YourPatSillyGoose/IndustryGrouping.csv")
行业集 = 行业集.sort_values('SIC_INDUSTRY_CLASS_NM',升序=真)
IndustrySet_alpha = IndustrySet.set_index([pd.Index([*range(0,len(industrySet), 1) ])], 'SIC_INDUSTRY_CLASS_NM') # 去除停用词
industrySet_alpha["sub_industry_filtered"] = [phrase.replace(',',"") for phrase in industrySet_alpha["SIC_INDUSTRY_CLASS_NM"]]
文档 = 列表(industrySet_alpha.sub_industry_filtered)
stoplist = set(['or', ',']) #'product', 'products', 'service', 'services', 'of'])
下载('停用词')
stop_words = stopwords.words('english')
stop_words_mine = [“商品”、“nec”、“&”、“服务”、“商店”、“设备”、“产品”、“服务”、“商业”、“代理商”、
“准备”、“准备”、“代理”、“产品”、“其他”、“货物”、“国家”、“保护”、“保护”、“机构”、
“计划”、“矿物”、“矿物”]
stop_words_new = list(set(stop_words + stop_words_mine))
texts = [ [word.lower() for word in document.split() if word.lower() not in stop_words_new] for document in documents] industrySet_alpha["sub_industry_filtered"] = [' '.join(word_arr) for word_arr in texts]
通常,在 NLP 算法中,有必要删除“停用词”——出现次数过多且不利地扭曲文档的计算机感知语义的词或短语。
这两种算法中的每一种都使用余弦相似度的概念,这是一种您可以阅读的基础数据科学 这里 .使用 TensorFlow 的第一个实现利用了 Google 的通用句子编码器数据集。简单来说,这是我们的模型将从中提取模式、语义和上下文以量化短语含义的语言主体。
导入 tensorflow_hub 作为集线器
从 scipy.spatial 导入距离
嵌入 = hub.load("[ https://tfhub.dev/google/universal-sentence-encoder/4](https://tfhub.dev/google/universal-sentence-encoder/4) ") def get_similar_industries_ten_flow(given_industry,industry_df,similarity_threshold = 0.0,pool_threshold = 10):
数据 = {'ComparerIndustry':[],'ComparerSubIndustry':[],'Similarity':[]}
processes_sub_ind = industry_df[industry_df["SIC_INDUSTRY_CLASS_NM"] == given_industry]["sub_industry_filtered"].iloc[0]
# 打印(processed_sub_ind)
对于 index,industry_df.iterrows() 中的行:
# 打印(行.SIC_INDUSTRY_CLASS_NM)
# 打印(行。行业)
嵌入 = embed([processed_sub_ind, row.sub_industry_filtered])
数据["ComparerSubIndustry"].append(row.SIC_INDUSTRY_CLASS_NM)
数据[“ComparerIndustry”].append(row.Industry) 数据[“相似度”].append(1 - distance.cosine(embeddings[0], embeddings[1]))
结果DF = pd.DataFrame(数据)
resultDF = resultDF[resultDF[“相似度”] > 相似度阈值]
resultDF = resultDF.sort_values('相似度', 升序=假)
resultDF = resultDF.head(pool_threshold)
resultDF.ComparerSubIndustry = pd.Series(resultDF.ComparerSubIndustry, dtype="string")
返回结果DF
beer_and_ale = get_similar_industries_ten_flow(“啤酒和啤酒”,industrySet_alpha)
在上面的代码中,给定一个特定的行业(例如“啤酒和啤酒”),我们遍历所有其他行业并获得余弦向量的差异,我们将其视为相似度得分。该模型使用 词嵌入 - 一种复杂的 NLP 技术。
下一个, GenSim 使用了图书馆。 GenSim 是一个了不起的 Python 库,它从整体上提供了工具来为简单和困难的 NLP 任务提供解决方案。
导入日志
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
将 gensim.downloader 导入为 api #api.info()
模型 = api.load('word2vec-google-news-300')
从 gensim.similarities 导入 SparseTermSimilarityMatrix, WordEmbeddingSimilarityIndex
从 gensim.corpora 导入字典
从 gensim.models 导入 TfidfModel def 预处理(句子):
如果 w 不在 stop_words_new 中,则返回 [w for w in sentence.lower().split()] phrase_vector = [预处理(sub_industry)列表中的子行业(industrySet_alpha.sub_industry_filtered)] # 创建一个字典并将其填充到
字典 = 字典(phrase_vector)
文档 = [ dictionary.doc2bow(sub_industry) for sub_industry in phrase_vector] #从文档字典中创建模型并应用于所有内容
tfidf = TfidfModel(文档)
tfidf_phrases = [ tfidf[sub_industry] 用于文档中的 sub_industry] # 使用模型嵌入的词创建相似度矩阵
termsim_index = WordEmbeddingSimilarityIndex(模型)
termsim_matrix = SparseTermSimilarityMatrix(termsim_index, 字典, tfidf) def get_similar_industries_gen_sim(given_industry,industry_df):
sic_industry_index = industry_df.index[industry_df['SIC_INDUSTRY_CLASS_NM'] == given_industry].tolist()[0]
数据 = {'ComparerIndustry':[], 'ComparerSubIndustry': [],'Similarity': []}
对于列表中的我(industry_df.SIC_INDUSTRY_CLASS_NM):
comparer_industry_index = industry_df.index[industry_df['SIC_INDUSTRY_CLASS_NM'] == i].tolist()[0]
相似度 = termsim_matrix.inner_product(tfidf_phrases[sic_industry_index], tfidf_phrases[comparer_industry_index], normalized=(True, True))
# print('相似度 = %.4f' % 相似度)
数据['ComparerSubIndustry'].append(i)
数据['相似度'].append(相似度)
数据["ComparerIndustry"].append(industry_df[industry_df["SIC_INDUSTRY_CLASS_NM"] == given_industry]["Industry"].iloc[0])
gen_sim_result_df = pd.DataFrame(数据)
gen_sim_result_df = gen_sim_result_df[gen_sim_result_df.Similarity > 0]
gen_sim_result_df = gen_sim_result_df.sort_values('相似度',升序=假)
gen_sim_result_df.ComparerSubIndustry = pd.Series(gen_sim_result_df.ComparerSubIndustry, dtype="string") 返回 gen_sim_result_df ads_agencies = get_similar_industries_gen_sim(“广告代理”,industrySet_alpha)
GenSim 模型使用 Google 的新闻数据集。随意尝试为模型提供的数据集,您可能会发现它会产生更好的结果。使用 api.info() 显示可用的数据集。
最后,即使每个算法都相对准确,我还是决定通过对每个算法的结果执行外连接来获得两全其美的效果。最后一段代码用了大约 20 分钟来执行所有 776 个 SIC 代码。随意使用函数签名中的算法权重。
# 时间复杂度 == O(n*(2*n) == 2n^2),
# 返回一个数据框字典,其中键是行业,值是数据框结果
def get_all_similar_industries(industry_df,algo_weights=[0.75,0.25]):
df_dict = {}
对于列表中的子行业(industry_df.SIC_INDUSTRY_CLASS_NM):
打印(子行业)
# 运行 gen sim 算法,过滤掉所有的零
gen_sim_res = get_similar_industries_gen_sim(sub_industry,industry_df)
# 运行 tensor_flow 算法,获得前 5-10 个?
ten_flow_res = get_similar_industries_ten_flow(sub_industry,industry_df)
# join_results = gen_sim_res.merge(ten_flow_res, on = ['ComparerSubIndustry']) #INNER JOIN
join_results = gen_sim_res.merge(ten_flow_res, suffixes=("__GS__", "__TF__"), how='outer', on = ['ComparerSubIndustry']) #OUTER JOIN
# 对每个进行左合并
join_results = join_results.replace(np.nan, 0)
join_results["ComparerIndustry"] = np.where(join_results.ComparerIndustry__GS__.notnull(),join_results.ComparerIndustry__GS__, join_results.ComparerIndustry__TF__ )
join_results["Combo_Similarity"] = join_results['Similarity__GS__'] * algo_weights[0] + join_results['Similarity__TF__'] * algo_weights[1]
join_results = join_results[['ComparerSubIndustry', 'Similarity__GS__', 'Similarity__TF__', 'ComparerIndustry', 'Combo_Similarity']]
join_results = join_results.sort_values('Combo_Similarity', 升序=假) df_dict[sub_industry] = join_results
返回 df_dict final_similarity_res = get_all_similar_industries(industrySet_alpha)
它在那里。为了更好地了解如何调整停用词和算法权重,我不得不运行该算法几次。虽然算法在很多时候都有重叠的结果,但对于给定的输入组合也产生了截然不同的相似度分数。我不知道这是为什么 …
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明