Как проверить, содержит ли данное английское предложение все бессмысленные слова, используя python?

#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. Попробуйте передать предложение «привет, мир», оно вернет ложь, т. Е. оно не бессмысленно