加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 对类似字符串进行分组

发布时间:2020-12-20 11:22:27 所属栏目:Python 来源:网络整理
导读:我正在尝试分析一堆搜索术语,这么多个人,他们并没有说太多.也就是说,我想对条款进行分组,因为我认为类似的术语应该具有相似的效果.例如, Term GroupNBA Basketball 1Basketball NBA 1Basketball 1Baseball 2 这是一个人为的例子,但希望它能解释我想要做的事
我正在尝试分析一堆搜索术语,这么多个人,他们并没有说太多.也就是说,我想对条款进行分组,因为我认为类似的术语应该具有相似的效果.例如,

Term               Group
NBA Basketball     1
Basketball NBA     1
Basketball         1
Baseball           2

这是一个人为的例子,但希望它能解释我想要做的事情.那么,做我所描述的最好的方法是什么?我认为nltk可能会有这样的东西,但我对它几乎不熟悉.

谢谢

解决方法

您需要对这些术语进行聚类,对于相似性度量,我建议在字符 – 克级别使用 Dice’s Coefficient.例如,将字符串分成两个字母的序列进行比较(term1 =“NB”,“BA”,“A”,“B”,“Ba”……).

nltk似乎提供了骰子作为nltk.metrics.association.BigramAssocMeasures.dice(),但它足够简单,以允许调整的方式实现.以下是如何比较角色而不是单词级别的这些字符串.

import sys,operator

def tokenize(s,glen):
  g2 = set()
  for i in xrange(len(s)-(glen-1)):
    g2.add(s[i:i+glen])
  return g2

def dice_grams(g1,g2): return (2.0*len(g1 & g2)) / (len(g1)+len(g2))

def dice(n,s1,s2): return dice_grams(tokenize(s1,n),tokenize(s2,n))

def main():
  GRAM_LEN = 4
  scores = {}
  for i in xrange(1,len(sys.argv)):
    for j in xrange(i+1,len(sys.argv)):
      s1 = sys.argv[i]
      s2 = sys.argv[j]
      score = dice(GRAM_LEN,s2)
      scores[s1+":"+s2] = score
  for item in sorted(scores.iteritems(),key=operator.itemgetter(1)):
    print item

使用您的字符串运行此程序时,会产生以下相似性分数:

./dice.py "NBA Basketball" "Basketball NBA" "Basketball" "Baseball"

('NBA Basketball:Baseball',0.125)
('Basketball NBA:Baseball',0.125)
('Basketball:Baseball',0.16666666666666666)
('NBA Basketball:Basketball NBA',0.63636363636363635)
('NBA Basketball:Basketball',0.77777777777777779)
('Basketball NBA:Basketball',0.77777777777777779)

至少对于这个例子,篮球和棒球术语之间的界限应该足以将它们聚集成单独的组.或者,您可以使用阈值在代码中更直接地使用相似性分数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读