Ищу способ разбить текст на n-граммы. Обычно я бы сделал что-то вроде:
import nltk
from nltk import bigrams
string = "I really like python, it's pretty awesome."
string_bigrams = bigrams(string)
print string_bigrams
Я знаю, что nltk предлагает только биграммы и триграммы, но есть ли способ разбить мой текст на четыре грамма, пять граммов или даже сто граммов?
Спасибо!
ingrams
, второй параметр которой - это степень ngram, которую вы хотите. Является ли ЭТА версия NLTK вы используете? Даже если нет, вот источник РЕДАКТИРОВАТЬ: естьngrams
иingrams
там,ingrams
будучи генератором.Ответы:
Отличные ответы на основе нативного Python, полученные от других пользователей. Но вот
nltk
подход (на всякий случай OP наказывается за то, что заново изобретает то, что уже существует вnltk
библиотеке).Есть модуль ngram, которым люди редко пользуются
nltk
. Это не потому, что трудно читать n-граммы, но обучение модели на n-граммах, где n> 3, приведет к большой разреженности данных.источник
sixgrams
?Я удивлен, что это еще не появилось:
источник
Использование только инструментов nltk
Пример вывода
Чтобы сохранить нграммы в формате массива, просто удалите
' '.join
источник
вот еще один простой способ сделать н-грамм
источник
Люди уже довольно хорошо ответили на сценарий, в котором вам нужны биграммы или триграммы, но если вам нужна каждаяграмма для предложения в этом случае, вы можете использовать
nltk.util.everygrams
Если у вас есть ограничение, например, в случае триграмм, где максимальная длина должна быть 3, вы можете использовать параметр max_len, чтобы указать его.
Вы можете просто изменить параметр max_len, чтобы получить любой грамм, то есть четыре грамма, пять граммов, шесть или даже сто граммов.
Вышеупомянутые решения могут быть изменены для реализации вышеупомянутого решения, но это решение намного проще, чем это.
Для дальнейшего чтения нажмите здесь
И когда вам просто нужен конкретный грамм, такой как биграмма или триграмма и т.д., вы можете использовать nltk.util.ngrams, как указано в ответе MAHassan.
источник
Вы можете легко создать для этого свою собственную функцию, используя
itertools
:источник
izip(*(islice(seq, index, None) for index, seq in enumerate(tee(s, N))))
я не совсем понимаю.Более элегантный подход к построению биграмм с использованием встроенных функций python
zip()
. Просто преобразуйте исходную строку в списокsplit()
, затем передайте список один раз в обычном режиме и один раз смещением на один элемент.источник
Я никогда не имел дела с nltk, но делал N-граммы как часть небольшого классного проекта. Если вы хотите найти частоту всех N-граммов, встречающихся в строке, вот способ сделать это.
D
даст вам гистограмму ваших N-слов.источник
collections.Counter(tuple(strparts[i:i+N]) for i in xrange(len(strparts)-N))
будет работать быстрее, чем try-exceptДля four_grams он уже находится в NLTK , вот фрагмент кода, который может помочь вам в этом:
Я надеюсь, что это помогает.
источник
Вы можете использовать sklearn.feature_extraction.text.CountVectorizer :
выходы:
Вы можете установить
ngram_size
любое положительное целое число. Т.е. вы можете разбить текст на четыре грамма, пять граммов или даже сто граммов.источник
Если эффективность является проблемой и вам нужно создать несколько разных n-граммов (до сотни, как вы говорите), но вы хотите использовать чистый питон, я бы сделал:
Использование :
~ Та же скорость, что и у NLTK:
Репост из моего предыдущего ответа .
источник
Nltk - это здорово, но иногда это накладные расходы для некоторых проектов:
Пример использования:
источник
Вы можете получить все 4-6 грамм, используя код без других пакетов ниже:
вывод ниже:
вы можете найти более подробную информацию в этом блоге
источник
Примерно через семь лет вот более элегантный ответ
collections.deque
:Вывод:
источник
Если вам нужен чистый итератор для больших строк с постоянным использованием памяти:
Тест:
Вывод:
источник