Найти - Пользователи
Полная версия: Поиск на совпадение слов
Начало » Python для новичков » Поиск на совпадение слов
1 2 3
adray
FishHook
да, результаты разные. Что конкретно хотел ТС я так и не понял, если нужны повторяющиеся слова, то вариант с множеством лучше, если нужны пары предложений в которых есть одинаковые слова, то Ваш. Либо можно допилить мой вариант, сделав декартово произведение предложений, в которых присутствует определенное слово - тада ассимптотика будет либо хуже чем в варианте с циклами либо оверхед
paraman
Всё, что мне нужно это поиск на совпадающие названия лекарственных средств из двух списков.
lorien
> Вы мой пример видели?

Видел, вообще не понял, что там написано :)
paraman
adray
return set(filter(lambda w: len(w) > 2, itertools.chain(*map(lambda x: x.split(), names))))

Согласен, быть может Вы помогли бы новичку и расписали не в строчку.
adray
paraman
Согласен, быть может Вы помогли бы новичку и расписали не в строчку.
Давайте сначала определимся, что нужно делать. Вот у нас есть два списка слов:
names1=['Hell eggs', 'Python 3', 'foo', 'spam filter', 'dirty dirt']
names2=['Python', 'foo', 'Hell yeah', 'clean dirt', 'spam filter']
Каков должен быть результат?
paraman
lorien
> Вы мой пример видели?Видел, вообще не понял, что там написано
Эх.. Объясню. Есть два списка лекарств:
name_list = ['Abilify', 'Aciphex', 'Actos', 'Abelcet XO', 'Adderall XR', 'Advair Diskus', 'Ambien CR', 'Abelcet XX', 'Aricept', 'Atripla', 'Avandia', 'Avapro', 'Avastin', 'Avelox', 'Avodart', 'Avonex', 'Benicar', 'Boniva', 'Byetta', 'Caduet', 'Celebrex']
name2_list = ['Aammonium alum', 'abacavir', 'abatacept', 'Abbokinase', 'abciximab-injection', 'VV Abelcet', 'Abilify', 'Abreva', 'acamprosate calcium delayed-release tablet', 'Acanya', 'acarbose', 'Accolate', 'AccuNeb', 'Accupril', 'Accuretic', 'Accutane', 'Accutrim', 'ACE Inhibitors', 'acebutolol', 'Aceon', 'Acetadote', 'acetaminophen', 'acetaminophen ', 'acetaminophen-isometheptene-dichloralphenazone', 'Acetasol', 'Acetasol HC', 'acetazolamide-oral', 'acetic acid ', 'acetic acid-otic', 'acetic acid-oxyquinoline-ricinoleic acid-vaginal', 'acetohexamide', 'acetohydroxamic acid-oral', 'acetylcysteine-inhalation', 'acetylcysteine-injection', 'acetylsalicylic acid', 'Acid', 'Aciphex', 'acitretin-oral', 'Actemra', 'Actigall', 'Actimmune', 'Actinex', 'Actiq', 'Activase', 'Actonel', 'Actos', 'Acular', 'Acular LS', 'acyclovir', 'A-Hydrocort']

В первом посте я описал способ, как я ищу, но он не всегда находит совпадения названий. В это списке, как пример лекарство Abelcet я не могу найти.

Мой результат:
[('Actos', 'Actos'), ('Abilify', 'Abilify'), ('Aciphex', 'Aciphex')]
adray
Не один из предложенных вариантов не является общим решением этой задачи.
Например:
['Cianidium Abirvalg', 'Aspirinium tablet']
['Abirvalg Spirtium', 'Cianidium tablet']
что в этом случае должно быть результатом?
Мой вариант найдет
{'Cianidium', 'Abirvalg', 'tablet'}
Вариант Fishhook'a дополнительно отобразит все пары с полными названиями лекарств в название которых входят слова из множества.

В моем примере в множестве присутствует элемент ‘tablet’, который вообще ниочем - слово совпадает, но в разных списках он соответствует совершенно разным лекарствам.

Чтобы результат был более осмысленным, можно ввести метрику на множестве названий лекарств и с помощью нее определять степень похожести двух элементов. Но и здесь ошибки не исключены
Isem
Весь срач начался изза неадекватного вопроса. Давайте лучше поговорим о том, где и как можно использовать аннотации к функциям.
py.user.next
>>> def f(lst):
...     return sum(map(str.split, lst), [])
... 
>>> words1 = ['AC Python', 'Mini GO', 'IronPython .NET', 'F# .Net Good']
>>> words2 = ['Python GO', 'Java AC', 'C# .Net Good', 'VB .Net', 'PHP Shit']
>>> words3 = set(f(words1)) & set(f(words2))
>>> words4 = filter(lambda i: len(i) == 2, words3) 
>>> list(words4)
['AC', 'GO']
>>>

>>> def f(lst):
...     return sum(map(str.split, lst), [])
... 
>>> words1 = ['Abilify', 'Aciphex', 'Actos', 'Abelcet XO', 'Adderall XR', 'Advair Diskus', 'Ambien CR', 'Abelcet XX', 'Aricept', 'Atripla', 'Avandia', 'Avapro', 'Avastin', 'Avelox', 'Avodart', 'Avonex', 'Benicar', 'Boniva', 'Byetta', 'Caduet', 'Celebrex']
>>> words2 = ['Aammonium alum', 'abacavir', 'abatacept', 'Abbokinase', 'abciximab-injection', 'VV Abelcet', 'Abilify', 'Abreva', 'acamprosate calcium delayed-release tablet', 'Acanya', 'acarbose', 'Accolate', 'AccuNeb', 'Accupril', 'Accuretic', 'Accutane', 'Accutrim', 'ACE Inhibitors', 'acebutolol', 'Aceon', 'Acetadote', 'acetaminophen', 'acetaminophen ', 'acetaminophen-isometheptene-dichloralphenazone', 'Acetasol', 'Acetasol HC', 'acetazolamide-oral', 'acetic acid ', 'acetic acid-otic', 'acetic acid-oxyquinoline-ricinoleic acid-vaginal', 'acetohexamide', 'acetohydroxamic acid-oral', 'acetylcysteine-inhalation', 'acetylcysteine-injection', 'acetylsalicylic acid', 'Acid', 'Aciphex', 'acitretin-oral', 'Actemra', 'Actigall', 'Actimmune', 'Actinex', 'Actiq', 'Activase', 'Actonel', 'Actos', 'Acular', 'Acular LS', 'acyclovir', 'A-Hydrocort']
>>> words3 = set(f(words1)) & set(f(words2))
>>> words4 = filter(lambda i: len(i) == 2, words3) 
>>> list(words4)
[]
>>> words3
{'Abilify', 'Abelcet', 'Actos', 'Aciphex'}
>>>
paraman
py.user.next
спасибо, но в строчку не так понятно. Буду разбираться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB