Выяснить конкретную строку, которая может быть использована в качестве предложения для пропущенного значения - PullRequest
0 голосов
/ 02 ноября 2018

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

В наборе данных есть Бренд (более высокий уровень) и Суббренд (более низкий уровень), которые классифицируют различные описания продуктов. Я загрузил его в фрейм данных pandas, чтобы попытаться манипулировать им.

Вот как выглядит подмножество набора данных:



    Brand  Sub_Brand  Product_Description

    7-Up   NaN        7-Up Original Can 327ml

    7-Up   Diet       Diet 7-Up Bottle 327ml

    7-Up   Diet       Diet 7-Up Can 327ml

    7-Up   NaN        7-Up Lemon Lemon Peach 327ml

    7-Up   NaN        7-Up Lemon Lemon Grapefruit 327ml

    7-Up   NaN        7-Up Lemon Lemon Original 327ml


В этом примере Diet уже заполнен в поле Sub-Brand, потому что он представляет Sub-Brand, связанный с этими продуктами, но для других продуктов, таких как «Lemon Lemon», мы пропускаем значения. То, что я пытаюсь сделать, - это найти способ избавиться от «Лимонного лимона» как хорошего кандидата для размещения в суббренде, потому что это подстрока, которая постоянно появляется в нескольких продуктах.

Легко определить, когда вы на это смотрите сами, я надеялся найти код для его очистки.

values = pd.DataFrame()
for index, row in df['Product_Description'].iteritems():
    query = row.split()
    values = values.append(query)

flush = pd.DataFrame(values.groupby(0).size())
flush = flush.sort_values(by=[0],ascending=False)
flush['word'] = flush.index
flush = flush.reset_index(drop=True)
flush.columns = ['count', 'word']
flush = flush[~flush['word'].str.lower().isin(df['Brand'].str.lower())]

Это помогает мне вывести «Лимон» как самое повторяющееся слово, и я могу вставить его в качестве столбца в качестве подсказки, где это слово появляется в качестве подстроки в столбце Product_Description. Тем не менее, это не будет "Лимон Лимон", который является желаемым результатом.

Я также подумал об использовании fuzzywuzzy и итерации Производственного описания, чтобы выполнить сопоставление token_sort_ratio со всеми остальными строками, чтобы увидеть, какие Описания постоянно имеют высокий процент совпадений

Например, делать результаты в:

fuzz.token_set_ratio("7UP LEMON LEMON ORIGINAL", "7UP LEMON LEMON WHITE PEACH")
67

Я думал об использовании чего-либо, что> 60, для сохранения их в списке и использования следующей функции, чтобы получить самую длинную общую подстроку

def longestSubstringFinder(string1, string2):
    answer = ""
    len1, len2 = len(string1), len(string2)
    for i in range(len1):
        match = ""
        for j in range(len2):
            if (i + j < len1 and string1[i + j] == string2[j]):
                match += string2[j]
            else:
                if (len(match) > len(answer)): answer = match
                match = ""
    return answer

Если я пройду через

test = longestSubstringFinder("7UP LEMON LEMON CUCUMBER MINT", "7UP LEMON LEMON WHITE PEACH").strip()
'7UP LEMON LEMON'

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

Я уверен, что есть лучший подход, и я надеялся, что меня укажут в правильном направлении, где я смогу собрать все это вместе и пробежаться по всему набору данных, который превышает 340 000 строк

Любая помощь будет принята с благодарностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...