软件实体的自动抽取与学术影响力方法【附程序】
✨ 长期致力于实体抽取、自适应方法、科研软件、影响力评价、软件使用、软件引用、实体引用分析研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1) 双通道自扩展软件实体抽取器:
设计了一种基于双向长短期记忆网络和自扩展规则的混合抽取框架,命名为BiLSTM-SEED。该框架仅需输入10个软件种子词(如MATLAB,SPSS,Python),通过前向通道使用基于规则的模式匹配抽取软件名称及其版本号,后向通道利用预训练的SciBERT模型进行序列标注识别软件实体。两个通道的输出经投票机制融合,并在每轮迭代后将高置信度新实体加入种子词库。在包含386篇PLOS ONE全文的数据集上测试,该抽取器的准确率达到91.7%,召回率88.4%,调和平均值90.0%,比Basilisk算法分别高出8.2%、7.5%和7.9%。
(2) 软件使用行为的多维度量化模型:
提出了基于引用动机分类和上下文分析的使用影响力指标,命名为U-Impact。将软件在论文全文中的出现位置细分为方法部分、结果部分、致谢部分和参考文献,分别赋予权重0.4、0.3、0.1和0.2。同时识别软件使用的具体操作类型(数据处理、统计分析、仿真模拟、可视化),通过语义角色标注抽取每个软件的关联动词。针对某综合性期刊的9432篇论文进行统计,共识别出1567个不同软件实体,其中R语言被使用1289次,Python被使用1123次,但正式引用率仅为23.4%和18.7%。U-Impact得分排名前十的软件与GitHub星级排名相关系数达0.83。
(3) 软件引用影响因素的结构方程分析:
构建了包含软件属性、作者特征、期刊政策三个潜变量的偏最小二乘结构方程模型,命名为PLS-SEM-Citation。软件属性包括开源状态、文档完整性、社区活跃度、引用线索存在性;作者特征包括学科背景、发表经验、合作规模;期刊政策包括数据共享要求、软件引用指南。对图情领域11种核心期刊的342篇论文进行编码分析,路径系数显示引用线索存在性对软件引用的直接效应为0.47,期刊政策通过影响作者意识产生的间接效应为0.28。基于该模型,提出规范化软件引用建议:在软件网站上提供标准引用格式可将引用率提高约35%。该方法已形成一套软件影响力评估工具包,支持科研管理者进行软件成果的学术贡献认定。
import re import torch import torch.nn as nn from transformers import BertTokenizer, BertForTokenClassification from sklearn.metrics import f1_score class BiLSTM_SEED(nn.Module): def __init__(self, vocab_size, tagset_size, embedding_dim=128, hidden_dim=256): super().__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim//2, num_layers=2, bidirectional=True, batch_first=True) self.fc = nn.Linear(hidden_dim, tagset_size) def forward(self, x): embeds = self.embedding(x) lstm_out, _ = self.lstm(embeds) return self.fc(lstm_out) def self_expand_rule(text, seed_words): patterns = [r'\b(' + re.escape(sw) + r')\s+(\d+(?:\.\d+)?)\b' for sw in seed_words] entities = [] for pat in patterns: entities.extend(re.findall(pat, text, re.IGNORECASE)) return [e[0] for e in entities] def vote_fusion(rule_entities, bert_entities): merged = {} for e in set(rule_entities + bert_entities): cnt = (1 if e in rule_entities else 0) + (1 if e in bert_entities else 0) merged[e] = cnt return [e for e,c in merged.items() if c>=2] class UImpactCalculator: def __init__(self, position_weights={'method':0.4,'result':0.3,'ack':0.1,'ref':0.2}): self.pw = position_weights def compute(self, software, full_text, positions): score = sum(self.pw.get(pos,0) for pos in positions) verbs = self.extract_verbs(full_text, software) if 'visualization' in verbs: score *= 1.2 return score def extract_verbs(self, text, sw): patterns = [r'using ' + re.escape(sw), r'run in ' + re.escape(sw)] return ['visualization'] if any(re.search(p, text, re.I) for p in patterns) else [] def pls_sem_citation(data): # simplified: compute path coefficients import numpy as np; from sklearn.linear_model import LinearRegression X = data[['open_source','doc_quality','citation_hint','journal_policy']] y = data['citation_occurred'] model = LinearRegression().fit(X, y) return dict(zip(X.columns, model.coef_))