Как преобразовать нграммы и частоты слов в строке в векторы для построения моделей SVN
Я пытаюсь использовать Python и NLTK для классификации текста по текстовым строкам, длина которых обычно составляет в среднем 10-20 слов.
Я хочу вычислить частоты слов и ngrams размера 2-4 и каким-то образом преобразовать их в векторы и использовать их для построения моделей SVN.
Я думаю, что может быть очень стандартный способ NLTK сделать все эти вещи, но у меня возникают проблемы с его поиском.
Я думаю, что стандартный способ уже может быть умным в отношении таких вещей, как обрезание слов (так что "Важные" и "Важность" будут рассматриваться как одно и то же слово), исключение знаков препинания, супер распространенных английских слов и реализация умный способ превратить эти цифры в векторы для меня. Я новичок в классификации текста и в Python, и я открыт обоим предложениям обо всем этом!
1 ответ
Хорошо, моя первая попытка ответить на вопрос о переполнении стека...
Ваш вопрос немного расплывчатый, поэтому я постараюсь ответить на него, насколько я понимаю. Похоже, вы спрашиваете, как подготовить текст до построения моделей SVN, в частности, как лемматизировать ввод текста, вычислять частоты слов, а также создавать n-граммы из заданной строки.
import nltk
from collections import Counter
from nltk import ngrams
from nltk.stem import WordNetLemmatizer
# lowercase, remove punctuation, and lemmatize string
def word_generator(str):
wnl = WordNetLemmatizer()
clean = nltk.word_tokenize(str)
words = [wnl.lemmatize(word.lower()) for word in clean if word.isalpha()]
for word in words:
yield word
# create list of freqs
def freq_count(str):
voc_freq = Counter()
for word in word_generator(str):
voc_freq[word] += 1
trimmed = sorted(voc_freq.items(), reverse=True, key=lambda x: x[1])
return trimmed
# create n-grams
def make_ngrams(str, n):
grams = ngrams([word for word in word_generator(str)], n)
return list(grams)
Пример 4-граммового вывода:
>>> my_str = 'This is this string, not A great Strings not the greatest string'
>>> print(freq_count(my_str))
[('string', 3), ('this', 2), ('not', 2), ('is', 1), ('a', 1), ('great', 1), ('the', 1), ('greatest', 1)]
>>> print(make_ngrams(my_str, 4))
[('this', 'is', 'this', 'string'), ('is', 'this', 'string', 'not'), ('this', 'string', 'not', 'a'), ('string', 'not', 'a', 'great'), ('not', 'a', 'great', 'string'), ('a', 'great', 'string', 'not'), ('great', 'string', 'not', 'the'), ('string', 'not', 'the', 'greatest'), ('not', 'the', 'greatest', 'string')]
Тогда вы можете делать с этим все, что захотите, например, создавать векторы.