【问题标题】:Is there a way to detect if two texts are relating to the same brand?有没有办法检测两个文本是否与同一个品牌有关?
【发布时间】:2021-07-30 12:49:56
【问题描述】:

给定两个文本,例如:“可口可乐”和“可口可乐”,是否有一种方法可以推广到其他品牌和其他文本来检测这两个文本是否与同一品牌相关?

现在我有这个简单的代码:

def matches_company_name(name1: str, name2: str):
    name1_lower_case = name1.lower()
    name2_lower_case = name2.lower()
    return (
        name1_lower_case in name2_lower_case
        or name2_lower_case in name1_lower_case
    )

我有几个想法要添加到可能的测试中:

  • 进行 POS 标记并比较 ORG
  • 用空格或破折号分隔,并检查是否是共同的部分。 (可能对一般人来说)
  • 设置某种编辑距离阈值(对于长度差异很大的字符串可能会失败)

是否已经有办法实现这一目标?您有什么好的想法(启发式方法)可以添加到测试中吗?

【问题讨论】:

  • Stack Overflow 不太适合开放式问题(“哪种算法最能实现目标 X?”)——我们的格式最适用于狭窄且符合规范正确答案的问题。
  • @CharlesDuffy 应该在哪里发布此类问题的最佳论坛?让我重新表述这个问题,我只想要一个可以完成这项工作的算法。我不在乎它是否是最好的
  • 您可以查看Levenshtein 距离,在此module 中实现。这是字符串之间相似性的度量。维基百科还提到了其他方法。
  • 如果将它们放在同一个大小写中并删除所有标点符号,这样就够了吗? (如果不知道就可能无法检测出可口可乐和可口可乐是相同的。)
  • 您可以按声音而不是文本进行索引:en.wikipedia.org/wiki/Soundex

标签: python string-comparison


【解决方案1】:

您可以实现上面提到的内容,但作为一个简单的解决方案,您可以像这样在 python 中使用 re lib:

import re
pattern = r'cocacola'
text = 'Coca-colafd   '

tt=text.lower()
s = re.sub(r'[^\w\s\d]','',tt)
# s = re.sub("\d+", " ", tt)
if re.match(pattern, s):
    print("Match and the word is -->>"+  str(s))
else:
    print("No match")

输出会是这样的

匹配和单词是-->>cocacolafd

你可以看到它匹配,即使你在单词中添加额外的字符

请注意,您可以通过它自己的库删除数字和空格以及重复器来指定输出,并使其更可靠

有关更多信息,您可以查看doc

例如:这是删除数字的模式:

s = re.sub("\d+", " ", tt) 

【讨论】:

  • 我知道正则表达式,但这种方法是手动的。我将不得不制定很多规则。
  • 那么正如你上面所说,你需要制作“词袋”和“tf-idf”来实现 word2vec 方法来实现这一点,最好的问候@Ángel
【解决方案2】:

我最终使用了fuzzywuzzy 包,特别是partial_token_set_ratio,它的效果非常好。

使用示例:

from fuzzywuzzy import fuzz


MIN_SCORE = 0.7
s1 = "cocacola"
s2 = "coca-cola"

is_same_company = fuzz.partial_token_set_ratio(s1, s2) > MIN_SCORE
print(is_same_company)
# True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2016-12-28
    相关资源
    最近更新 更多