Как использовать nltk.API Text findall() для определения успеха и сбоя в логике клиента

#python #python-3.x #nltk

Вопрос:

Я могу использовать API findall() без проблем и проблем. Ниже приведен простой случай

 import nltk

raw = "Management Discussion and Analysis"
raw = raw.lower()
tokens = nltk.word_tokenize(raw)
text = nltk.Text(tokens)
text.findall(r"<.*> <.*> <.*> <analysis>")
 

Выход

управленческое обсуждение и анализ


Теперь, если я изменю raw переменную так, чтобы findall ничего не нашел.

 import nltk

raw = "Management Discussion and Analysisss"
raw = raw.lower()
tokens = nltk.word_tokenize(raw)
text = nltk.Text(tokens)
text.findall(r"<.*> <.*> <.*> <analysis>")
 

Выход


Итак, вопрос в том, как на стороне вызывающего абонента отличить успех от неудачи?.

Я также проверил и отладил код библиотеки, и реализация заключается в том, чтобы просто распечатать содержимое и ничего не возвращать. Мне это показалось немного странным, но я не знаю, почему API ничего не возвращает.

 hits = self._token_searcher.findall(regexp)
hits = [" ".join(h) for h in hits]
print(tokenwrap(hits, "; "))
 

Пожалуйста, посоветуйте.

Ответ №1:

При дальнейшей работе над этим я смог продумать/реализовать логику, которая соответствовала моим требованиям. Я опубликовал ответ, чтобы кто-нибудь другой мог сослаться на него в будущем.

 def nltk_text_findall_object(nltkText, regexp):
    outList      = []
    finalOutList = []

    # now assign stdout handle with some text file so that
    # nltk findall() API output/print could be redirected.
    tempFileName = "tempFile.txt"
    orig_out = sys.stdout
    sys.stdout = open(tempFileName, "w")

    nltkText.findall(regexp)
    # now restore the stdout handle with original value.
    sys.stdout.close()
    sys.stdout = orig_out

    # Now check for the content in the file and return the list.
    file = open(tempFileName,"r")
    raw = file.read()
    file.close()
    # nltk findall() API returns the list of strings separated
    # by ; as per their current implementation.
    outList = raw.split(";")
    outList = [str(item).strip() for item in outList]
    for item in outList:
        if(len(item) > 1):
            finalOutList.append(item)
    
    
    # now we are done with the file, let's us delete it.
    os.remove(tempFileName)
    return finalOutList
 

Логика Клиента Для Использования Вышеуказанного Метода

 raw = "Management Discussion and Analysis"
raw = raw.lower()
tokens = nltk.word_tokenize(raw)
regex  = r"<.*> <.*> <.*> <analysis>"
outList = nltk_text_findall_object(text, regex)
if(len(outList) == 0):
    print("Did Not Found")
else:
    print("Found")
 

Пожалуйста, кто-нибудь, дайте мне знать, если есть лучший способ достижения/реализации варианта использования, опубликованного в моем вопросе.