关键词匹配

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

性能评估:

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)







Nginx是一个流行的开源Web服务器软件,它可以进行高性能的Web服务和反向代理。Nginx提供了许多功能强大的配置选项,其中之一是模糊路径关键词匹配。 在Nginx的配置文件中,可以使用通配符和正则表达式来进行路径关键词匹配。这样可以方便地匹配多个路径或文件,并进行相应的操作。 一个常见的应用场景是当网站有多个子域名或路径,而这些子域名或路径都需要使用不同的配置时。通过使用模糊路径关键词匹配,可以实现将不同的子域名或路径映射到不同的配置块中。这样可以方便地管理和控制不同子域名或路径的访问。 例如,可以通过以下配置将所有以 "/api/" 开头的请求转发到后端的API服务器: ``` location /api/ { proxy_pass http://api_server; } ``` 这样,当收到任何以 "/api/" 开头的请求时,Nginx会将这些请求转发到配置文件中定义的 "api_server" 后端服务器。 另一个常见的应用场景是防止恶意的路径攻击。通过使用正则表达式进行模糊路径关键词匹配,可以识别和阻止具有恶意路径的请求。例如,可以通过以下配置拦截所有以 ".php" 结尾的请求: ``` location ~ \.php$ { return 403; } ``` 这样,当收到任何以 ".php" 结尾的请求时,Nginx会返回403错误,从而拦截这些恶意请求。 总之,Nginx的模糊路径关键词匹配功能使得我们可以方便地进行路径匹配和相应的操作,包括转发请求、拦截恶意请求等。这些功能能够提高网站的性能和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值