Подтвердить что ты не робот

Удаление списка слов из строки

У меня есть список стоп-слов. И у меня есть строка поиска. Я хочу удалить слова из строки.

В качестве примера:

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

Почему это происходит?

4b9b3361

Ответ 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"