#python #python-3.x #dictionary #nltk
#питон #python-3.x #словарь #nltk
Вопрос:
Я хочу проверить в программе на Python, содержит ли данное английское предложение все бессмысленные слова.
Верните значение true, если в предложении есть все слова, которые не имеют значения
например, sdfsdf sdf ssdf fsdf dsd sd
Возвращает false, если предложение содержит хотя бы одно слово, имеющее значение
например, Привет asdf
Вот код, который я написал.
Обновлен код для переменной is_meaningless
import nltk nltk.download('words') from nltk.corpus import words def is_sentence_meaningless(sentence): is_meaningless = True for word in sentence.split(): if(word in words.words()): is_meaningless = False break return is_meaningless print(is_sentence_meaningless("sss sss asdfasdf asdfasdfa asdfasfsd")) print(is_sentence_meaningless(" sss sss asdfasdf asdfasdfa asdfasfsd TEST"))
Есть ли лучшая альтернатива этому коду? Кроме того, как я могу добавить к нему свой собственный корпус? Например, у меня есть несколько специфичных для домена слов, которые я хочу вернуть как истинные, возможно ли это?
Ответ №1:
Вы можете использовать set.difference
метод (обратите внимание, что, поскольку слова in nltk.corpus.words
в основном написаны строчными буквами, также необходимо использовать str.lower
метод, например, «привет» есть, но «Привет» нет).:
def is_sentence_meaningless(sentence, domain_specific_words): s_set = set(sentence.lower().split()) if s_set.difference(words.words() domain_specific_words) == s_set: return True return False
Просто К вашему сведению, но ваша функция не выполняет то, что говорится в вашем объяснении.
Комментарии:
1. В зависимости от версии Python вы можете использовать
-
оператор, напримерset(sentence.split()) - words.words()
2. @CutePoison ты прав.
-
также действует.3. @ManlaiA не могли бы вы подтвердить, пожалуйста, работает ли ваш код? предоставление ошибки атрибута: объект «список» не имеет атрибута «разница»
Ответ №2:
Учитывая, что список слов содержит только уникальные слова, функцию можно сделать более эффективной, преобразовав список в набор.
Кроме того, ваша логика, похоже, не согласуется с подразумеваемой целью функции (на основе ее названия). Предложение было бы бессмысленным, если бы какое-либо из слов в предложении не было найдено в наборе корпусов.
Преобразование списка слов в набор сопряжено со значительными накладными расходами. Поэтому, если функция будет использоваться несколько раз, было бы лучше обернуть ее в класс.
Таким образом:
import nltk.corpus class sentence_checker: def __init__(self): self.words = set(nltk.corpus.words.words()) def is_sentence_meaningless(self, sentence): for word in sentence.split(): if not word in self.words: return True return False sc = sentence_checker() print(sc.is_sentence_meaningless('hello')) print(sc.is_sentence_meaningless('hellfffo'))
Комментарии:
1. print(sc.is_sentence_meaningless(‘ssss asas’)) должен возвращать значение False, но возвращает значение true
2. Помните, что функция называется is_sentence_meaningless. Это предложение бессмысленно, поэтому оно возвращает значение True
3. Во всех случаях он возвращает значение True.
4. Попробуйте передать предложение «привет, мир», оно вернет ложь, т. Е. оно не бессмысленно