Near-duplicate Detection(文章相似度计算)

该博客主要探讨了文本内容的相似度检测,包括Jaccard距离、余弦相似度以及SimHash和MinHash等方法。作者提到官方SimHash不支持中文,因此建议结合结巴分词进行关键词提取和权重计算来处理中文文本。

近一个月主要研究文本内容的相似度


考虑的主要方法为:

jaccard distance

cosine similarity

simHash

minHash

some tricks:simple but efficient


simhash:

官方的simhash并不大支持中文:

中文版并不支持索引 没有索引的simhash不算simhash哈

因此直接利用官方的,加入结巴分词提取关键字及权重即可:

#simhash
def t2():
	
	cFile=open('7dataSingle.txt').read()
	lines=cFile.splitlines()
	
	initList=[]
	line =lines[0]
	line=line.split('\t')
	content=bs(line[2]).get_text().encode('utf-8')
	kwList=jcut.extract_tags(content,20,True)
	initList.append((line[0].strip(),Simhash(kwList)))

	index=SimhashIndex(initList,64,3)

	for line in lines:
		line=line.split('\t')
		if len(line)<3:
			continue
		content=bs(line[2]).get_text().encode('utf-8')
		kwList=jcu
<think> 我们正在讨论Swiper循环模式下的DOM复制问题。用户现在询问一个具体的选择器操作是否正确: `document.querySelector('.swiper-slide-duplicate .swiper-slide-duplicate-next')` 首先,需要理解这个选择器的含义: 1. `.swiper-slide-duplicate`:这是Swiper在循环模式下复制的幻灯片(clone)的类名。 2. `.swiper-slide-duplicate-next`:这个类名看起来是自定义的,因为Swiper的标准类名中并没有这个。Swiper循环模式下复制的幻灯片会添加`swiper-slide-duplicate`类,同时根据位置会添加`swiper-slide-duplicate-prev`或`swiper-slide-duplicate-next`(注意:标准类名是`swiper-slide-duplicate-prev`和`swiper-slide-duplicate-next`,但这里用户写的是`.swiper-slide-duplicate-next`,中间没有空格,所以应该是同一个元素同时拥有这两个类?) 但是,用户的选择器是: `.swiper-slide-duplicate .swiper-slide-duplicate-next` 注意:中间有一个空格。这意味着选择的是: - 一个拥有类`swiper-slide-duplicate`的元素内部的 - 拥有类`swiper-slide-duplicate-next`的元素 这显然不是用户想要的。因为: - 在循环模式下,复制的幻灯片(即克隆的slide)本身会同时拥有`swiper-slide-duplicate`和`swiper-slide-duplicate-next`(或`swiper-slide-duplicate-prev`)这两个类,它们是在同一个元素上的。 所以,正确的选择器应该是: `.swiper-slide-duplicate.swiper-slide-duplicate-next` 注意:中间没有空格,表示同时拥有这两个类的元素。 另外,Swiper的标准类名是: - 对于复制的幻灯片,类名为:`swiper-slide swiper-slide-duplicate` - 同时,如果是复制的前一个幻灯片(即出现在最后面的那个复制品),则还会添加:`swiper-slide-duplicate-prev` - 如果是复制的后一个幻灯片(即出现在最前面的那个复制品),则还会添加:`swiper-slide-duplicate-next` 因此,用户可能想选择的是那些被复制并且作为“下一个”的幻灯片(即放在最前面的复制品)。那么正确的选择器是: `.swiper-slide-duplicate.swiper-slide-duplicate-next` 但是,我们通常不需要直接操作这些复制品,因为Swiper提供了API来获取当前真实的索引(`realIndex`)以及事件处理方式。直接操作DOM复制节点可能会遇到问题,因为它们是克隆的,可能不包含Vue添加的事件监听器和状态。 所以,建议用户使用Swiper提供的事件和API来操作,而不是直接操作DOM。 回答结构: 1. 指出选择器错误:中间的空格导致选择的是子元素,而正确的应该是同一个元素同时拥有两个类(无空格)。 2. 解释Swiper循环模式下的类名机制。 3. 给出正确的选择器写法(如果需要操作这些复制节点)。 4. 提醒:直接操作复制节点可能存在风险(如事件监听丢失),建议使用Swiper API。 同时,根据用户之前的问题,他们遇到的问题是循环模式下复制节点的事件监听问题,所以再次强调使用Swiper事件代理的要性。 最后,生成相关问题。 </think>### 关于 `document.querySelector('.swiper-slide-duplicate .swiper-slide-duplicate-next')` 操作的分析 #### 该操作存在的问题 1. **选择器语法错误**: ```javascript // 错误的层级关系(中间有空格) document.querySelector('.swiper-slide-duplicate .swiper-slide-duplicate-next'); // 正确的写法(使用并列类选择器) document.querySelector('.swiper-slide-duplicate.swiper-slide-duplicate-next'); ``` - 空格表示层级关系(父元素 .swiper-slide-duplicate 内的子元素 .swiper-slide-duplicate-next) - 实际需要的应该是**同时拥有这两个类**的元素(并列类选择器) 2. **类名准确性**: - Swiper 循环模式生成的复制元素类名是 `swiper-slide-duplicate` - 方向标识是 `swiper-slide-duplicate-prev` 和 `swiper-slide-duplicate-next` - 建议直接使用官方类名避免自定义错误 3. **更可靠的获取方式**: ```javascript // 通过 Swiper API 获取 const duplicateSlides = swiper.slides.filter(slide => slide.classList.contains('swiper-slide-duplicate') ); // 获取特定位置的复制元素 const duplicateNext = duplicateSlides.find(slide => slide.classList.contains('swiper-slide-duplicate-next') ); ``` #### 推荐解决方案 1. **使用 Swiper 原生 API**: ```javascript // 初始化时保存实例 const swiper = new Swiper('.swiper', { loop: true, on: { init: function() { // 获取所有复制元素 const duplicates = this.slides.filter( slide => slide.classList.contains('swiper-slide-duplicate') ); // 获取特定复制元素 const duplicateNext = duplicates.find( slide => slide.classList.contains('swiper-slide-duplicate-next') ); } } }); ``` 2. **事件代理替代 DOM 操作**: ```javascript swiper.on('click', (swiper, event) => { const clickedSlide = event.target.closest('.swiper-slide'); if (clickedSlide.classList.contains('swiper-slide-duplicate')) { const slideType = clickedSlide.classList.contains('swiper-slide-duplicate-next') ? 'next' : 'prev'; console.log(`点击了${slideType}方向的复制slide`); } }); ``` 3. **动态内容处理方案**: ```vue <swiper :key="refreshKey" @after-init="handleSwiperInit"> <swiper-slide v-for="item in items" :class="{ 'custom-duplicate-next': isDuplicateNext(item.id) }"> <!-- 内容 --> </swiper-slide> </swiper> ``` ```javascript methods: { handleSwiperInit(swiper) { this.swiperInstance = swiper; }, isDuplicateNext(id) { return this.swiperInstance?.slides.some(slide => slide.dataset.id === id && slide.classList.contains('swiper-slide-duplicate-next') ); } } ``` #### 注意事项 1. **循环模式下的索引偏移**: - 复制元素会导致 `slideIndex` 与实际索引不一致 - 始终使用 `swiper.realIndex` 获取真实索引 ```javascript swiper.on('slideChange', () => { console.log('真实索引:', swiper.realIndex); }); ``` 2. **避免直接操作复制元素**: - 复制元素是临时创建的镜像节点 - 任何直接修改会在 Swiper 更新时丢失 - 应通过数据驱动方式更新内容 3. **性能优化**: ```javascript new Swiper('.swiper', { loop: true, loopAdditionalSlides: 2, // 仅复制必要数量 loopPreventsSlide: true // 防止边界滑动异常 }); ``` > 最佳实践是通过 Swiper 的 API 和事件系统操作元素,避免直接查询 DOM 类名。如需精确控制,应结合 `data-*` 属性和 Swiper 的索引系统[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值