Поиск большого набора данных для нескольких строк - PullRequest
0 голосов
/ 26 августа 2011

Я работаю с двумя наборами данных:

В наборе 1 содержится 500 элементов в одном столбце (все строки) В наборе 2 содержится 30 000 членов в двух столбцах (с разделителями табуляции), где столбец 1 представляет собой числовой идентификаторчисло и столбец 2 - это список строк с разделителями (10 000 возможных).

Мне нужно найти в столбце 2 набора 2 строки в наборе 1 и пометить (или изолировать) все строки в наборе 2по крайней мере, 1 матч.Хиты также должны быть очень конкретными (то есть я хочу взять «У Джейка есть теннисный мяч», а не «Мне нравится, что у Джейка есть сумка для теннисного мяча»).Если это поможет, я могу выяснить все строки, которые мне нужно специально избегать.

Я начал в Excel ("if (isnumber (search (")), но обнаружил, что существует ограничение на числоВложенные, если можно делать заявления. У меня также был некоторый успех с использованием grep, но я понял, что это отдельные линии, которых мне особенно нужно избегать (строки типа «Мне нравится, что у Джейка есть сумка для тенниса»).

Я начинаю думать, что Python - это путь, но я не уверен, как его кодировать. У кого-нибудь еще есть какие-либо предложения?

вот пример из набора 2 (идентификатор подделан длязащитить анонимность), чтобы дать лучшее представление о том, с чем я работаю:

1230    DEVELOPMENTAL DELAY, LANGUAGE DELAY, MOTOR DELAY  
2257    MULTIPLE CONGENITAL ANOMALIES  
2344    MICROCEPHALY, AUTISM SPECTRUM DISORDER, SHORT STATURE  
3342    DEVELOPMENTAL DELAY, SEIZURE DISORDER, ATAXIA  
7651    CONGENITAL ANOMALY, UNSPECIFIED  
7869    FAMILY HISTORY OF AUTISM SPECTRUM DISORDER

В этом сценарии я буду искать термин «расстройство спектра аутизма», и я хочу идентификатор 2344, но не идентификатор 7869.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 26 августа 2011

Если вы просто хотите получить точное совпадение с Набором 1, вы можете сделать это с помощью поиска.введите эту формулу в строку 1 столбца 3 набора 2, где SET1 - адрес диапазона SET1 = IF (ISERROR (MATCH ($ a1, SET1,0), "Miss", "Hit"), а затем скопируйте формулу вниз на 30000строки (дважды щелкните по светлому черному квадрату в юго-восточном углу ячейки). (Существует также более эффективный вариант, если вы можете отсортировать Набор 1)

0 голосов
/ 26 августа 2011

Не уверен насчет того, как вы храните свои наборы, но каким-то образом вам нужно преобразовать / импортировать их в некоторые структуры данных Python.Кажется, что очень простой способ сделать это состоит в том, чтобы держать set1 в наборе (или списке) python и set2 в dict, с идентификаторами в качестве ключей и строками в качестве значений.Тогда простая итерация по ключам и поиск соответствующих значений приведут к желаемым результатам.Этого должно быть достаточно

set1 = set( ... ) # your 500 members must be here 
set2 = dict( ... ) # your 30000 other ids-strings stuff

# and a simple function to make queries

def handle_query( query_string ):
    for id in set2:
        if query_string in set2[id].split(","):
            yield id   

# now you can call it for every string in set1 (or whatever...)

for string in set1:
    print string, [ i for i in handle_query( string ) ] 

и да, Python - это путь:)

Однако это не оптимально (и плохо масштабируется, если набор данных больше), потому что вам придетсяперебрать все идентификаторы.Это нормально для 30000 идентификаторов, но «почти совершенство» заключается в так называемом «перевернутом индексе», который является основной концепцией поисковой системы.Таким образом, оптимальный способ «хранить» ваши данные set2 в некотором смысле:

DEVELOPMENTAL DELAY -> 1230, another_id, yet_another_id, ...
LANGUAGE DELAY -> 1230, ...
MOTOR DELAY -> 1230, ...
MULTIPLE CONGENITAL ANOMALIES -> 2257, ...
etc

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

...