#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")
Пожалуйста, кто-нибудь, дайте мне знать, если есть лучший способ достижения/реализации варианта использования, опубликованного в моем вопросе.