Удаление списка слов из строки
У меня есть список стоп-слов. И у меня есть строка поиска. Я хочу удалить слова из строки.
В качестве примера:
stopwords=['what','who','is','a','at','is','he']
query='What is hello'
Теперь код должен делить "Что" и "есть". Однако в моем случае это полоски "a", а также "at". Я дал свой код ниже. Что я могу делать неправильно?
for word in stopwords:
if word in query:
print word
query=query.replace(word,"")
Если входной запрос "Что такое Hello", я получаю вывод как:
wht s llo
Почему это происходит?
Ответы
Ответ 1
Это один из способов сделать это:
query = 'What is hello'
stopwords = ['what','who','is','a','at','is','he']
querywords = query.split()
resultwords = [word for word in querywords if word.lower() not in stopwords]
result = ' '.join(resultwords)
print result
Я заметил, что вы также хотите удалить слово, если его нижний регистр находится в списке, поэтому я добавил вызов lower()
в проверку состояния.
Ответ 2
Принятый ответ работает, когда предоставляется список слов, разделенных пробелами, но это не тот случай в реальной жизни, когда может быть пунктуация для разделения слов. В этом случае требуется re.split
.
Кроме того, тестирование с использованием stopwords
в виде set
ускоряет поиск (даже если существует компромисс между хешированием строк и поиском при небольшом количестве слов).
Мое предложение:
import re
query = 'What is hello? Says Who?'
stopwords = {'what','who','is','a','at','is','he'}
resultwords = [word for word in re.split("\W+",query) if word.lower() not in stopwords]
print(resultwords)
вывод (в виде списка слов):
['hello','Says']
Ответ 3
Глядя на другие ответы на ваш вопрос, я заметил, что они рассказали вам, как делать то, что вы пытаетесь сделать, но они не ответили на вопрос, который вы поставили в конце.
Если входной запрос "Что такое Hello", я получаю вывод как:
wht s llo
Почему это происходит?
Это происходит потому, что .replace() заменяет подстроку, которую вы даете ей точно.
например:
"My, my! Hello my friendly mystery".replace("my", "")
дает:
>>> "My, ! Hello friendly stery"
.replace() по существу разделяет строку подстрокой, заданной как первый параметр, и соединяет ее вместе со вторым параметром.
"hello".replace("he", "je")
логически похож на:
"je".join("hello".split("he"))
Если вы все еще хотите использовать .replace для удаления целых слов, вы могли бы подумать, что добавление пробела до и после будет достаточно, но это оставляет в начале и конце строки слова, а также прерывистые версии подстроки.
"My, my! hello my friendly mystery".replace(" my ", " ")
>>> "My, my! hello friendly mystery"
"My, my! hello my friendly mystery".replace(" my", "")
>>> "My,! hello friendlystery"
"My, my! hello my friendly mystery".replace("my ", "")
>>> "My, my! hello friendly mystery"
Кроме того, добавление пробелов до и после не будет ловить дубликаты, поскольку оно уже обработало первую подстроку и будет игнорировать ее в пользу продолжения:
"hello my my friend".replace(" my ", " ")
>>> "hello my friend"
По этим причинам ваш принятый ответ Робби Корнелиссен - рекомендуемый способ сделать то, что вы хотите.
Ответ 4
основываясь на том, что сказал karthikr, попробуйте
' '.join(filter(lambda x: x.lower() not in stopwords, query.split()))
объяснение:
query.split() #splits variable query on character ' ', e.i. "What is hello" -> ["What","is","hello"]
filter(func,iterable) #takes in a function and an iterable (list/string/etc..) and
# filters it based on the function which will take in one item at
# a time and return true.false
lambda x: x.lower() not in stopwords # anonymous function that takes in variable,
# converts it to lower case, and returns true if
# the word is not in the iterable stopwords
' '.join(iterable) #joins all items of the iterable (items must be strings/chars)
#using the string/char in front of the dot, i.e. ' ' as a joiner.
# i.e. ["What", "is","hello"] -> "What is hello"