#python #python-3.x #nlp
#python #python-3.x #nlp
Вопрос:
Постановка задачи: Отфильтруйте эти слова из полного набора text6, имея первую букву в верхнем регистре, а все остальные буквы в нижнем регистре. Сохраните результат в переменной title_words. выведите количество слов, присутствующих в title_words.
Я перепробовал все возможные способы найти ответ, но не знаю, где я отстаю.
import nltk
from nltk.book import text6
title_words = 0
for item in set(text6):
if item[0].isupper() and item[1:].islower():
title_words = 1
print(title_words)
Я тоже пробовал таким образом:
title_words = 0
for item in text6:
if item[0].isupper() and item[1:].islower():
title_words = 1
print(title_words)
Я не уверен, сколько требуется для этого количества, независимо от того, какое количество приходит, это не позволяет мне пройти испытание. Пожалуйста, дайте мне знать, если я делаю что-то не так в этом коде
Комментарии:
1. Вы пробовали распечатывать некоторые
item
буквы вset(text6)
? Как насчет печати некоторых из них и было ли вашеif
условие true или false. Управляйте C и просмотрите его вручную, чтобы увидеть, ведет ли он себя так, как вы ожидаете. (Как насчет слов, которые являются просто пунктуацией?)2. @khelwood, 🙁 Я пытался добавить эти элементы в список и проверил список вручную, но это не работает. Что-то не так в моем коде или я упускаю что-то важное?
Ответ №1:
Одно из приведенных выше предложений сработало для меня. Пример кода ниже.
title_words = [word for word in text6 if (len(word)==1 and word[0].isupper()) or (word[0].isupper() and word[1:].islower()) ]
print(len(title_words))
Комментарии:
1. что вы имели в виду, говоря «приведенные выше предложения»? В вашем ответе нет ничего выше.
Ответ №2:
Я думаю, проблема в set(text6)
. Я предлагаю вам повторить text6.tokens
.
Обновление, объяснение
Приведенный вами код верен.
Проблема в том, что текст может содержать одни и те же слова несколько раз. Выполнение set(words)
уменьшит общее количество доступных слов, поэтому вы начнете с неполного набора данных.
Другие ответы необязательно неверны при проверке правильности слова, но они повторяют один и тот же неправильный набор данных.
Комментарии:
1. @Lucifer Я обновил ответ объяснением. Надеюсь, это поможет вам! 🙂
Ответ №3:
В вопросе «Сохраните результат в переменной title_words. выведите количество слов, присутствующих в title_words.»
Результатом фильтрации списка элементов является список элементов того же типа. В вашем случае фильтрация списка text6
(при условии, что это список строк) приведет к (меньшему) списку строк. Вашей title_words
переменной должен быть этот отфильтрованный список, а не количество строк; количество строк будет просто длиной списка.
Это также неоднозначно из вопроса, следует ли отфильтровывать слова с заглавной буквы (т. Е. удалено из меньшего списка) или отфильтровано (т.Е. сохранено в списке), поэтому попробуйте оба варианта, чтобы увидеть, неправильно ли вы их интерпретируете.
Ответ №4:
Попробуйте использовать регулярные выражения:
>>> import re
>>> from nltk.book import text6
>>>
>>> text = ' '.join(set(text6))
>>> title_words = re.findall(r'([A-Z]{1}[a-z] )', text)
>>> len(title_words)
461
Комментарии:
1. Спасибо @constt за постоянные усилия и обновления. Ценю это. Но все равно это не решает проблему. Поверьте мне, я скопировал вставленную задачу без каких-либо изменений. В любом случае спасибо
Ответ №5:
В text6 есть 50 одноэлементных элементов (элементов длиной один), однако ваш код не передаст ни один из них как успешный, например, ‘I’ или ‘W’ и т.д. Это правильно, или вам нужны слова минимальной длины 2?
Комментарии:
1. 🙁 Пробовал и это len (item) > 1 или 2, но все равно безрезультатно. Иногда я думаю, что лучше сдаться. 🙂 Много дней я пытаюсь, и сегодня я пробовал со всеми присутствующими здесь людьми, но это не проходит. 🙂 Спасибо, брат. Сейчас я сдаюсь.
2. Вы пытались включить все слова длиной = 1, которые также пишутся с заглавной буквы? Не беспокойтесь, если вы двигаетесь дальше, однако, будьте осторожны.
Ответ №6:
Всего несколько изменений в соответствии с тем, что задает вопрос.
from nltk.book import text6
title_words = []
for item in set(text6):
if item[0].isupper() and item[1:].islower():
title_words.append(item)
print(len(title_words))
Ответ №7:
Попробуйте это:
title_words = [ word for word in text6 if word.istitle()]
print(len(title_words))