关键词匹配

我这次没有用深度学习的方式,直接手撕的,所以会有通用性差的弊端。如果有复现的好的模型,未来可以用来优化下。

性能评估:

1、召回率recall:269933条数据中数据中一共有13730条提及关键词,有13728条被识别出来了

regex_match.py召回率=99%

2、准确率precision:识别的关键词中有13694是对的

regex_match.py准确率=73% ,如果加入‘部分准确’的情况,准确率升为99%

1)完全准确 10038

content有N个关键词,model匹配到N个。

2)部分准确 3656

content有N个关键词,model匹配到N+M个(M为常数)。

3)部分不准确 0

content有N个关键词,model匹配到N-M个

3、算法对比

处理相同数据时,给定相同关键词库,flash_text只识别出7205条数据,召回率52.5%,大约为regex_match.py的一半。

4、结果分析

一般没有被准确识别主要原因是错别字和漏写,如果想进一步提高识别率,需要扩充关键词库。由于匹配时,findall()函数只有贪婪和非贪婪两种模式,这也是传统文本匹配模型的弊端,即对于一些特定的文本匹配任务需要根据其特点进行人工设计,导致不同的文本匹配任务之间不具有通用性。如果想提高准确率,可以用深度文本匹配。比如,

2022年有一篇Divide and Conquer: Text Semantic Matching with Disentangled Keywords and Intents提出了一种分治的办法,即将匹配问题分解为两个子问题:关键字匹配和意图匹配。其中的意图匹配可以在用户表达比较抽象时,将他的内容作为抽象意图处理,识别出最相似的关键词。https://arxiv.org/abs/2203.02898

代码:

import pandas as pd
import re


def read_excel(file, col_name1,col_name2):
   data = pd.read_excel(file)
   col1= data[col_name1]
   col2 = data[col_name2]
   return data, col1,col2

def save(data,path):
    data.to_excel(path,index=False)
    print("已经完成匹配并保存到文件:", path)
    return data

# 处理空值或非字符串值 for model
def drop_nan(data):
    return data.dropna().astype(str).str.lower()

def drop_nan_2(data):
   new_data=[]
   for i in data:
      new_i=i.replace(' ','')
      new_data.append(new_i)
   return list(set(new_data))

def drop_url_nan(data):
    url_pattern = r"(?:http|https)://[a-zA-Z0-9-\.]+(?:[a-zA-Z0-9/%&=?_#.-]+)?\b"
    p = re.compile(url_pattern)
    new_data = []
    for i in data:
        if p.match(i):
            inew = p.sub("", i)
            new_data.append(inew)
        else:
            inews = i.replace(' ', '').lower()
            new_data.append(inews)
    return new_data

# 将每一行的元素拆分成单个元素,综合成一个大列表 for model
def split_index_to_list(data):
    lst1=[]
    lst2=[]  
    for item in data:
        if '、' in item:
            lst1.append(item.split('、'))
        else:
            lst1.append(item)

    for item in lst1:
        if isinstance(item,list):
            lst2.extend(item)
        else:
            lst2.append(item)
    
    return lst2

'''
由于 型号 = 英文+数字(+中文),所以为了降低复杂度,
设定4种特殊情况:全英文/中文/数字,空字符
'''
def is_all_english(text):
    return bool(re.match(r'^[a-zA-Z]+$', text))

def is_all_chinese(text):
    return bool(re.match(r'^[\u4e00-\u9fa5]+$', text))

def is_all_digits(text):
    return bool(re.match(r'^\d+$', text))

def is_empty(text):
    return not text.strip()

# data-原数据,model-型号扩写关键词,model_standard-型号标准关键词,content-对话文本
def roll(data,model_before,model_after,model_sandard,content):
   lst=[] 
   n=0
   m=0
   length=len(content)
   # 遍历内容列中的每个内容
   for content_item in content:
         matched_keyword = []
         mapped_models = []

         # 异常检查
         e=is_all_english(content_item)
         c=is_all_chinese(content_item)
         d=is_all_digits(content_item)
         emp=is_empty(content_item)
         if emp or e or c or d:
            m+=1             

         else:               
            # 遍历型号列表中的每个正则表达式模式
            for pattern in [re.compile(keyword, flags=re.IGNORECASE) for keyword in model_after]:
               # 在当前内容中搜索匹配项(不同的数据类型有不同的搜索方式,list,set,‘’)
               match=pattern.findall(content_item)
               if match:
                  #print(match)  # match是一个包含关键词的数组                
                  n+=1
                  matched_keyword.extend(match)                 
                     
                  # 将标准型号名称与之对应
                  mapping_dict = dict(zip(model_before, model_sandard))   

                  for keyword in matched_keyword:
                     for key, value in mapping_dict.items():
                        if keyword in key :                                        
                           mapped_models.append(value)
                           mapped_models=list(set(mapped_models))
                           break
      
         # 将匹配的关键词添加到结果列表
         lst.append(mapped_models)

   
   print('提及产品型号的次数:',n)
   print('不需要进行匹配的文本数:',m) 
   print('文本总数:',length)

   data['model']=lst

   return data   


# 去重
def Remove_duplicates(data):
   lst=[]
   for i in data:
      new_i = list(set(i))
      lst.append(new_i)
      return lst
       


# 关键词路径
model_file = ''
# 需要匹配的文本路径
content_file = ''

_, model_list, models = read_excel(model_file, col_name1='你要提取的列名', col_name2='列名2')
data, content, _ = read_excel(content_file, col_name1='列名1', col_name2='列名2')

model_list1 = drop_nan(model_list)
model_list2 = split_index_to_list(model_list1)

content = drop_url_nan(content)

data1 = roll(data, model_list1, model_list2, models, content)
data2=Remove_duplicates(data1)

new_file_path = ''
new_file = save(data2, new_file_path)







<think>嗯,用户想在LabVIEW中实现主观题关键词匹配的功能。首先,我需要理解这个需求的具体应用场景。可能是在线考试系统或者自动评分系统中,需要对学生的文本答案进行关键词匹配,以判断答案的相关性和正确性。接下来,我得考虑LabVIEW的特性,它主要是图形化编程,适合数据采集和仪器控制,但处理文本可能不是它的强项。不过,LabVIEW确实有字符串处理的函数,应该可以实现基本的匹配功能。 首先,用户可能需要从文本中提取关键词,然后与预设的关键词列表进行比对。这里的关键步骤可能包括文本预处理(比如去除标点、转换为小写)、分词、关键词匹配和评分逻辑。LabVIEW中的字符串函数可以处理大小写转换、搜索子字符串等操作。但是中文分词可能比较复杂,因为LabVIEW本身没有内置的中文分词工具,可能需要调用外部库或者使用简单的字符串匹配方法。 然后,考虑到用户可能需要的是部分匹配而非精确匹配,比如答案中出现部分关键词即可得分。所以需要设计一个评分机制,比如每个关键词的权重,或者根据匹配到的关键词数量给出分数。这时候,使用数组来存储关键词,并遍历数组进行匹配可能比较有效。 另外,用户可能希望这个功能有一定的灵活性,比如支持多个关键词的组合,或者处理同义词。这时候可能需要更复杂的逻辑,比如使用正则表达式来增强匹配能力,或者在关键词列表中包含多个可能的表达方式。 还有一个问题是性能,如果处理大量文本或大量关键词,LabVIEW的效率如何。虽然LabVIEW是图形化编程,但合理设计程序结构,比如使用并行处理和高效的搜索算法,应该可以满足一般需求。 最后,可能需要提供示例代码,展示如何在LabVIEW中实现这些步骤。比如使用“匹配模式”函数来搜索关键词,使用数组操作来统计匹配次数,以及如何计算得分。同时,提醒用户如果需要更高级的功能,可能需要结合其他工具或语言,比如调用Python脚本进行中文分词,再返回结果给LabVIEW处理。 总结一下,可能的步骤是:文本预处理→关键词匹配→评分逻辑。每一步在LabVIEW中都有对应的函数和结构可以实现,但中文处理可能需要额外注意。同时,提供扩展建议,比如集成其他工具来增强功能。</think>在LabVIEW中实现主观题关键词匹配可通过以下步骤完成: ### 一、基础实现方法 1. **文本预处理模块**: - 使用`转换为小写字母`函数统一文本大小写 - 通过`搜索替换字符串`函数去除标点符号 - 推荐使用`正则表达式`实现高效字符过滤[^1] 2. **关键词匹配核心逻辑**: ```LabVIEW [流程图] 文本输入→创建关键词数组→For循环遍历关键词匹配模式函数→计数匹配项→输出匹配率 ``` 使用`匹配模式`函数时建议设置忽略大小写选项,并启用正则表达式模式提升匹配灵活性[^2] ### 二、增强功能实现 1. **同义词处理**: - 建立同义词词典簇(Cluster) - 采用多条件结构分支匹配 - 示例: ```LabVIEW Case 1: "人工智能" → {"AI","人工智慧","机器智能"} Case 2: "神经网络" → {"NN","深度学习网络"} ``` 2. **权重评分系统**: $$ Score = \sum_{i=1}^n (KeywordWeight_i \times MatchCount_i) $$ 通过数值控件设置权重系数,使用公式节点实现加权计算 ### 三、性能优化建议 1. **并行处理技术**: - 对长文本采用分块处理(Chunk Processing) - 使用生产者/消费者模式提升吞吐量 2. **缓存机制**: - 预编译正则表达式模板 - 对高频关键词建立哈希索引表 ### 四、扩展应用方向 1. 集成NI Text-Based API实现自然语言处理 2. 通过Python节点调用NLTK/结巴分词库实现中文分词[^3] 3. 结合视觉模块实现手写文字识别后的关键词提取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值