Возвращает String Сходства между двумя столбцами Dataframe String - Python - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь построить результаты на основе поиска, где у меня будет входной фрейм данных, имеющий одну строку, и я хочу сравнить с другим фреймом данных, имеющим почти 1 миллион строк.Я использую пакет под названием Record Linkage

Однако я не могу обработать опечатки.Допустим, у меня в исходных данных есть «HSBC», а пользователь вводит его как «HKSBC», я хочу вернуть только результаты «HSBC».Сравнивая расстояние сходства строк с jarowinkler, я получаю следующие результаты:

from pyjarowinkler import distance
distance.get_jaro_distance("hksbc", "hsbc", winkler=True, scaling=0.1)
>> 0.94

Однако я не могу дать "HSBC" в качестве вывода, поэтому я хочу создать новый столбец в моих пандахВ кадре данных, где я буду вычислять оценки сходства строк и возьму ту часть оценки, которая имеет оценку выше определенного порога.

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

PS У меня нет намерений использовать fuzzywuzzy, предпочтительно либо Jaccard, либо Jaro-Winkler

PPS. Любые другие идеи для обработки опечаток для поиска на основе вещитакже приемлемо

1 Ответ

0 голосов
/ 25 сентября 2019

Мне удалось решить эту проблему только через связывание записей.Таким образом, в основном он выполняет первоначальное индексирование и генерирует ссылки-кандидаты (вы можете обратиться к документации по «SortedNeighbourhoodindexing» для получения дополнительной информации), то есть он выполняет мультииндексацию между двумя фреймами данных, которые необходимо сравнить, что я сделал вручную.

Так вот мой код:

import recordlinkage

df['index'] = 1 # this will be static since I'll have only one input value
df['index_2'] = range(1, len(df)+1)

df.set_index(['index', 'index_2'], inplace=True)

candidate_links=df.index

df.reset_index(drop=True, inplace=True)
df.index = range(1, len(df)+1)

# once the candidate links has been generated you need to reset the index and compare with the input dataframe which basically has only one static index, i.e. 1

compare_cl = recordlinkage.Compare()
compare_cl.string('Name', 'Name', label='Name', method='jarowinkler') # 'Name' is the column name which is there in both the dataframe

features = compare_cl.compute(candidate_links,df_input,df) # df_input is the i/p df having only one index value since it will always have only one row
print(features)
                       Name
index   index_2 
  1      13446       0.494444
         13447       0.420833
         13469       0.517949

Теперь я могу дать фильтр следующим образом:

features = features[features['Name'] > 0.9] # setting the threshold which will filter away my not-so-close names.

Тогда,

df = df[df['index'].isin(features['index_2'])

Этоотсортирует мои результаты и выдаст окончательный фрейм данных, у которого оценка имени больше определенного порога, установленного пользователем.

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