确定某些公司名称是否相同的模型

问题描述 投票:0回答:1

所以我试图研究可以帮助确定公司名称是否相同的模型。所以基本上我有一个数据集,列出了不同投资基金持有的一堆公司名称,但每个投资基金可能对公司名称有不同的命名约定,例如苹果公司或苹果普通股。有没有什么模型可以帮助判断它们是否是同一个公司名称。我知道这可能超出了我能做的范围,但我知道 chatgpt 可以很好地做到这一点,我可以像传递 20 个公司名称一样传递它,它会告诉我它们是否相同,但显然我的数据集有 500,000 行,所以我无论如何我不知道我可以将这些数据传递给chatgpt,并且我听说它在较长的计算中失败。

我研究了编辑距离和模糊匹配,但我觉得当字符串名称中包含普通股之类的东西时,它会失败,即使作为一个人,很明显苹果公司和苹果美国普通股指的是同一家公司。所以任何可以帮助我解决这个问题的机器学习算法或模型将不胜感激。我很高兴自己研究它们,我只是想要一个模糊匹配的起点,而编辑距离并没有多大帮助,除非我可能找到一种方法来删除常见的填充词,例如普通股票、ptd、lty 等。谢谢任何帮助:))

再次编辑:这是一个较小的演示。

import pandas as pd
from fuzzywuzzy import fuzz 

data = [
    "29METALS LIMITED",
    "29METALS LIMITED",
    "29Metals Limited",
    "29METALS LTD",
    "29METALS LTD.",
    "29METENTY LTD",
    "29 METALS COMMON STOCK",
    "29 METAL PTD",
    "29METALS",
]

df = pd.DataFrame(data, columns=["Company"])

df["Cleaned_Company"] = df["Company"].str.replace("[^\w\s]", "").str.lower()


def match_names(name, group):
    for group_name in group:
        if fuzz.ratio(name, group_name) > 80:  
            return group_name
    return name

groups = {}
for name in df["Cleaned_Company"].unique():
    matched_name = match_names(name, groups.keys())
    if matched_name in groups:
        groups[matched_name].append(name)
    else:
        groups[matched_name] = [name]


group_number = 1
for group_name, group_values in groups.items():
    df.loc[df["Cleaned_Company"].isin(group_values), "Group"] = group_number
    group_number += 1

print(df)

现在输出是:

公司 清洁_公司 团体
29金属有限公司 29种金属有限 1.0
29金属有限公司 29种金属有限 1.0
29金属有限公司 29种金属有限 1.0
29金属有限公司 29金属有限公司 1.0
29金属有限公司 29金属有限公司 1.0
29METENTY 有限公司 29metenty 有限公司 2.0
29 金属普通股 29种金属普通股 3.0
29 金属PTD 29 金属ptd 4.0
29金属 29金属 5.0

由此我们可以看到,它识别出了 5 个团体,实际上除了 29Mententy LTD 之外,它们都是同一家公司。我希望这能让我的帖子更加清晰,谢谢:)

algorithm machine-learning
1个回答
0
投票

不清楚您的数据是什么样的。

我猜你的文字很大。如果文本太大,KMP 也是一个值得考虑的选择,它速度很快,但您也许可以用更简单的方式解决问题。因为那里的公司数量有限。

KMP算法很难解释。如果您有兴趣了解它是如何工作的,请查看维基百科

def get_lps(p):
    lps, j = [0] * len(p), 0
    for i in range(1, len(p)):
        while j and p[i] != p[j]:
            j = lps[j - 1]
        if p[i] == p[j]:
            j += 1
        lps[i] = j
    return lps


def kmp(s, p):
    lps, indices, j = get_lps(p), [], 0
    for i in range(len(s)):
        while j and s[i] != p[j]:
            j = lps[j - 1]
        if s[i] == p[j]:
            j += 1
        if j == len(p):
            indices.append(i - len(p) + 1)
            j = lps[j - 1]
    return indices


s = """"
some text Apple Stock common us inc
some text Apple INC Stock common us inc
some text Apple Inc. Stock common us inc
some text APPL Stock common us inc Apple APPLE
"""

print(kmp(s, 'Apple'))
print(kmp(s, 'Apple INC'))
print(kmp(s, 'Apple inc'))
print(kmp(s.lower(), 'apple inc'))
print(kmp(s.upper(), 'APPLE'))
print(kmp(s.upper(), 'NOTAPPLE'))

打印

它打印找到匹配项的第一个索引:

[12, 48, 88, 154]
[48]
[]
[48, 88]
[12, 48, 88, 154, 160]
[]

注意

我假设您事先知道公司名称,因此变量

pattern

© www.soinside.com 2019 - 2024. All rights reserved.