Это довольно многоуровневый / загруженный вопрос, и я ломал голову, пытаясь понять, как лучше с этим справиться.
В наборе данных есть Бренд (более высокий уровень) и Суббренд (более низкий уровень), которые классифицируют различные описания продуктов. Я загрузил его в фрейм данных 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 строк
Любая помощь будет принята с благодарностью