Вопрос

Проблема заключается в следующем:

У меня есть одно резюме, обычно состоящее из 20–50 слов, которое я хотел бы сравнить с другими относительно похожими резюме.Общая категория и географическое положение, к которым относится резюме, уже известны.

Например, если люди из одного и того же района пишут о строительстве дома, я хотел бы иметь возможность перечислить эти резюме с некоторой степенью уверенности в том, что они на самом деле относятся к строительству домов, а не к строительству гаража или бассейна на заднем дворе.

Набор данных в настоящее время составляет около 50 000 документов с темпами роста около 200 документов в день.

Предпочтительными языками являются Python, PHP, C/C++, Haskell или Erlang, в зависимости от того, какой из них может выполнить работу.Кроме того, если вы не возражаете, я хотел бы понять причину выбора конкретного языка.

Это было полезно?

Решение

Вы могли бы взглянуть на ВЕБСОМ проект.

Несмотря на то, что их веб-сайт не обновлялся именно в этом году, решаемая проблема очень похожа.Поскольку они обрабатывали объемы данных, аналогичные вашим (и даже больше), как 10 лет назад, сегодня вы, вероятно, могли бы запускать алгоритмы почти на мобильном телефоне.

Другие советы

Вы можете попробовать использовать некоторые меры сходства строк, такие как Jaccard и Dice, но вместо расчета перекрытия символов вы рассчитываете перекрытие слов.Например, используя Python, вы можете использовать следующее:

def word_overlap(a, b):
    return [x for x in a if x in b]


def jaccard(a, b, overlap_fn=word_overlap):
    """
    Jaccard coefficient (/\ represents intersection), given by :
        Jaccard(A, B) = (A /\ B) / (|a|) + (|b|) - (A /\ B)
    """
    c = overlap_fn(a, b)
    return float(len(c)) / (len(a) + len(b) - len(c))

jaccard("Selling a beautiful house in California".split(), "Buying a beautiful crip in California".split())

Поскольку в Python есть встроенная поддержка наборов, мы можем изменить код JG как,

def jaccard(a, b):
    """
    Jaccard coefficient (/\ represents intersection), given by :
        Jaccard(A, B) = (A /\ B) / (|a|) + (|b|) - (A /\ B)
    """
    c = a.intersection(b)
    return float(len(c)) / (len(a) + len(b) - len(c))

jaccard(set("Selling a beautiful house in California"), set("Buying a beautiful crip in California"))

На самом деле нет конкретного языка, который можно было бы выбрать.Вы пытаетесь найти смысловое сходство.Это очень большая территория.Вас может заинтересовать эта статья:

Корпусные и основанные на знаниях меры семантического сходства текста

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top