首页 > 编程问答 >比较列表中的标题并找到相似的标题

比较列表中的标题并找到相似的标题

时间:2024-07-28 04:38:17浏览次数:7  
标签:python scikit-learn tfidfvectorizer

我编写了一个 Python 代码,该代码接收产品标题作为输入,并从演示文稿中查找类似的标题。一切都运行良好,但它错误地识别了一些标题。 我认为它错误地识别了带有数字的标题

说明: get_price(myProductTitle) 函数的输入是一个标题,例如: Razer Gold PIN Malaysia 7 MYR

检查下面列出

product_spans = soup.find_all('span', class_='variable-item-span')

示例输出:

['Razer Gold MY - 5 MYR', 'Razer Gold MY - 500 MYR', 'Razer Gold MY - 20 MYR', 'Razer Gold MY - 200 MYR', 'Razer Gold MY - 7 MYR', 'Razer Gold MY - 100 MYR', 'Razer Gold MY - 30 MYR', 'Razer Gold MY - 10 MYR', 'Razer Gold MY - 300 MYR', 'Razer Gold MY - 50 MYR', 'Razer Gold MY - 40 MYR', 'Razer Gold MY - 3 MYR']

例如,我的标题应该来自上面的列表 查找 Razer Gold MY - 7 MYR 但这是错误的

我的代码:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from woocommerce import API
import re

wcapi = API(
url="http://example.com",
consumer_key="",
consumer_secret="",
version="wc/v3"
)

response = wcapi.get("products", params={"per_page": 99, "category": 74 })

chrome_options = Options()
chrome_options.add_argument("--headless")

def preprocess(text):
text = re.sub(r'[^A-Za-z0-9\s]', '', text).lower()
return text
def get_price(myProductTitle):
driver = webdriver.Chrome(options=chrome_options)
print( myProductTitle)

url = "http://example.com/product/razer-gold-myr/"
driver.get(url)
time.sleep(2)
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, 'variable-item-span'))
)
soup = BeautifulSoup(driver.page_source, 'html.parser')
# product_spans = soup.find_all('span', class_='variable-item-span')

  product_spans = ['Razer Gold MY - 5 MYR', 'Razer Gold MY - 500 MYR', 
  'Razer 
  Gold MY - 20 MYR', 'Razer Gold MY - 200 MYR', 'Razer Gold MY - 7 
  MYR', 
 'Razer Gold MY - 100 MYR', 'Razer Gold MY - 30 MYR', 'Razer Gold MY - 
  10 
  MYR', 'Razer Gold MY - 300 MYR', 'Razer Gold MY - 50 MYR', 'Razer 
  Gold MY - 
  40 MYR', 'Razer Gold MY - 3 MYR']

if not product_spans:
    print("No product spans found.")
    driver.quit()
    return

texts = [span.get_text().strip() for span in product_spans]
print("Extracted texts:", texts)
if not texts:
    print("No texts to compare.")
    driver.quit()
    return

preprocessed_title = preprocess(myProductTitle)
preprocessed_texts = [preprocess(text) for text in texts]

vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([preprocessed_title] + preprocessed_texts)
cosine_similarities = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:])
print("Cosine similarities:", cosine_similarities)

if cosine_similarities.max() == 0:
    print("No similar product found.")
    driver.quit()
    return

most_similar_index = cosine_similarities.argmax()
most_similar_text = texts[most_similar_index]
most_similar_span = product_spans[most_similar_index]

print(most_similar_text)
print(most_similar_span)
driver.quit()


if response.status_code == 200:
products = response.json()
for product in products:
    get_price(product['name'])
else:
print('error product not found')

比较列表中的标题并找到类似的标题

下载完整代码


代码的问题在于,它过分依赖 TF-IDF 和余弦相似度来查找相似的标题。虽然这些方法适用于自然语言处理,但对于此任务来说过于复杂,可能会导致不准确。具体来说,TF-IDF 会根据词语在文档集中出现的频率对词语进行加权,这意味着数字(如“7 MYR”)如果在数据集中很少见,可能会被认为不重要。

与其使用 TF-IDF 和余弦相似度,不如尝试更简单的基于规则的方法来比较标题。例如,可以尝试以下操作:

  1. 按名称匹配产品: 由于的产品标题结构似乎一致(“产品名称 - 值”),因此可以简单地提取要比较的两个标题的产品名称和值。如果产品名称匹配,则已经找到了一个匹配的项目,而无需进行复杂的比较。以下是如何执行此操作的示例:
def extract_product_info(title):
  """从标题中提取产品名称和值。"""
  parts = title.split(' - ')
  if len(parts) == 2:
    return parts[0].strip(), parts[1].strip()
  else:
    return title, None

def get_price(myProductTitle):
  # ...(现有的代码以提取 product_spans)

  my_product_name, my_product_value = extract_product_info(myProductTitle)

  for span in product_spans:
    span_text = span.get_text().strip()
    span_product_name, span_product_value = extract_product_info(span_text)

    if my_product_name == span_product_name:
      print("找到匹配项:", span_text)
      # ...(在此处添加的价格提取逻辑)
      return

  print("未找到匹配项。")

  1. 如果需要更精细的比较: 如果严格的名称匹配不够强大,可以使用 difflib.SequenceMatcher 计算两个标题之间的相似度比率。这将考虑字符级别的差异,即使数字略有不同也能提供更准确的匹配。

这是一个使用 SequenceMatcher 的示例:

from difflib import SequenceMatcher

def get_price(myProductTitle):
  # ...(现有的代码以提取 product_spans)

  best_match = None
  best_similarity = 0

  for span in product_spans:
    span_text = span.get_text().strip()
    similarity = SequenceMatcher(None, myProductTitle, span_text).ratio()

    if similarity > best_similarity:
      best_similarity = similarity
      best_match = span_text

  if best_match:
    print("找到最佳匹配项:", best_match)
    # ...(在此处添加的价格提取逻辑)
  else:
    print("未找到匹配项。")

这些基于规则的方法应该比 TF-IDF 和余弦相似度提供更准确且更有效的结果,用于比较产品标题。

标签:python,scikit-learn,tfidfvectorizer
From: 78802387

相关文章

  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......
  • python基本语法三天速成系列day1(看完这篇你就会)
    注释注释是代码非常重要的一部分,它的主要作用有:解释代码目的:注释可以说明代码段或函数的目的和功能,帮助其他开发者快速理解代码的意图。复杂逻辑说明:对于复杂的算法或业务逻辑,通过注释可以解释这些逻辑是如何工作的,降低后续维护的难度。提高可读性:良好的注释可以使代码结......
  • Python学习笔记46:游戏篇之外星人入侵(七)
    前言到目前为止,我们已经完成了游戏窗口的创建,飞船的加载,飞船的移动,发射子弹等功能。很高兴的说一声,基础的游戏功能已经完成一半了,再过几天我们就可以尝试驾驶飞船击毁外星人了。当然,计分,游戏次数,背景音乐,开始启动等按钮的功能需要我们慢慢添加,这些功能不影响游戏的使用,影......
  • Python学习笔记45:游戏篇之外星人入侵(六)
    前言飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。子弹模块子弹和飞船模块,在游戏逻辑中有一种生成与被生成的表面关系,因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中,飞船与子弹并不是is的关系,甚至可以说不是has的关系。因此我们需要将两个对......
  • 三种语言实现二分(C++/Python/Java)
    题目给定一个按照升序排列的长度为......
  • python+flask计算机毕业设计农场营销管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代农业的快速发展,农场管理日益复杂,尤其是营销环节,传统的销售模式已难以满足市场快速变化的需求。农场主面临着如何高效管理农资采购......
  • python+flask计算机毕业设计社区独居老人健康管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会老龄化的加速,独居老人群体日益庞大,成为社会关注的焦点。这一群体在享受独立生活的同时,也面临着健康监测不及时、生活照料缺失、医......