2016-02-29 9 views
2

У меня есть большой образец текста, например:Нечеткий поиск Python

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

И я пытаюсь обнаружить, если «включить прогноз для выживания» в тексте, но нечетким образом. Например, «вовлечь пророноз выживания» должен также вернуть положительный ответ.

Я посмотрел в fuzzywuzzy, NLTK и новых регулярных выражений нечетких функций, но я не нашел способ сделать:

if [anything similar (>90%) to "that sentence"] in mybigtext: 
    print True 
+0

Im новое здесь, но я думаю, что это должно решить вашу проблему: http://stackoverflow.com/questions/30449452/python-fuzzy-text-search?rq=1 –

+0

Посмотрите на [gensim] (https://radimrehurek.com/gensim/index.html), особенно раздел [сходство] (https://radimrehurek.com/gensim/tut3.html). – Jan

ответ

0

Там есть функция, ниже которой, если слово содержится в тексте она будет отобразить совпадение. Вы могли импровизировать, чтобы заставить его проверить полные фразы в тексте.

Вот функция я сделал:

def FuzzySearch(text, phrase): 
    """Check if word in phrase is contained in text""" 
    phrases = phrase.split(" ") 

    for x in range(len(phrases)): 
     if phrases[x] in text: 
      print("Match! Found " + phrases[x] + " in text") 
     else: 
      continue 
+0

Да, это было мое первое предположение, но не было возможности сделать это предложение мудрым нечетким ... –

1

Следующая не является идеальным, но это должно вам начать работу. Он использует nltk, чтобы сначала разбивать текст на слова, а затем создает набор, содержащий стебли всех слов, фильтруя любое слово остановки. Он делает это как для вашего образца текста, так и для образца запроса.

Если пересечение двух наборов содержит все слова в запросе, это считается совпадением.

import nltk 

from nltk.stem import PorterStemmer 
from nltk.tokenize import word_tokenize 
from nltk.corpus import stopwords 

stop_words = stopwords.words('english') 
ps = PorterStemmer() 

def get_word_set(text): 
    return set(ps.stem(word) for word in word_tokenize(text) if word not in stop_words) 

text1 = "The arterial high blood pressure may engage the prognosis for survival of the patient as a result of complications. TENSTATEN enters within the framework of a preventive treatment(processing). His(Her,Its) report(relationship) efficiency/effects unwanted is important. diuretics, medicine of first intention of which TENSTATEN, is. The therapeutic alternatives are very numerous." 
text2 = "The arterial high blood pressure may engage the for survival of the patient as a result of complications. TENSTATEN enters within the framework of a preventive treatment(processing). His(Her,Its) report(relationship) efficiency/effects unwanted is important. diuretics, medicine of first intention of which TENSTATEN, is. The therapeutic alternatives are very numerous." 

query = "engage the prognosis for survival" 

set_query = get_word_set(query) 
for text in [text1, text2]: 
    set_text = get_word_set(text) 
    intersection = set_query & set_text 

    print "Query:", set_query 
    print "Test:", set_text 
    print "Intersection:", intersection 
    print "Match:", len(intersection) == len(set_query) 
    print 

Сценарий предусматривает два текста, один пассы, а другой не делает, он производит следующий вывод, чтобы показать вам, что он делает:

Query: set([u'prognosi', u'engag', u'surviv']) 
Test: set([u'medicin', u'prevent', u'effici', u'engag', u'Her', u'process', u'within', u'surviv', u'high', u'pressur', u'result', u'framework', u'diuret', u')', u'(', u',', u'/', u'.', u'numer', u'Hi', u'treatment', u'import', u'complic', u'altern', u'patient', u'relationship', u'may', u'arteri', u'effect', u'prognosi', u'intent', u'blood', u'report', u'The', u'TENSTATEN', u'unwant', u'It', u'therapeut', u'enter', u'first']) 
Intersection: set([u'prognosi', u'engag', u'surviv']) 
Match: True 

Query: set([u'prognosi', u'engag', u'surviv']) 
Test: set([u'medicin', u'prevent', u'effici', u'engag', u'Her', u'process', u'within', u'surviv', u'high', u'pressur', u'result', u'diuret', u')', u'(', u',', u'/', u'.', u'numer', u'Hi', u'treatment', u'import', u'complic', u'altern', u'patient', u'relationship', u'may', u'arteri', u'effect', u'framework', u'intent', u'blood', u'report', u'The', u'TENSTATEN', u'unwant', u'It', u'therapeut', u'enter', u'first']) 
Intersection: set([u'engag', u'surviv']) 
Match: False 
+0

Да, я подумал об этой возможности! Если я действительно не могу найти какое-либо другое решение, я буду использовать его! Благодаря ! –

1

Использование модуля regex, первый раскол по предложениях затем проверить, если нечеткая картина в предложении:

tgt="The arterial high blood pressure may engage the prognosis for survival of the patient as a result of complications. TENSTATEN enters within the framework of a preventive treatment(processing). His(Her,Its) report(relationship) efficiency/effects unwanted is important. diuretics, medicine of first intention of which TENSTATEN, is. The therapeutic alternatives are very numerous." 

for sentence in regex.split(r'(?<=[.?!;])\s+(?=\p{Lu})', tgt): 
    pat=r'(?e)((?:has engage the progronosis of survival){e<%i})' 
    pat=pat % int(len(pat)/5) 
    m=regex.search(pat, sentence) 
    if m: 
     print "'{}'\n\tfuzzy matches\n'{}'\n\twith \n{} substitutions, {} insertions, {} deletions".format(pat,m.group(1), *m.fuzzy_counts) 

распечаток:

'(?e)((?:has engage the progronosis of survival){e<10})' 
    fuzzy matches 
'may engage the prognosis for survival' 
    with 
3 substitutions, 1 insertions, 2 deletions 
+0

Итак, играя с номером числа fuzzy_counts, как ограничение их ... я мог бы что-то сделать, чтобы сделать разницу между: «вовлекать прогноз» и «не участвовать в прогнозе» Это кажется прекрасным спасибо! Я попытаюсь показать свою проблему как можно решенную, если дело. –

 Смежные вопросы

  • Нет связанных вопросов^_^