Как преобразовать нграммы и частоты слов в строке в векторы для построения моделей 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')]

Тогда вы можете делать с этим все, что захотите, например, создавать векторы.

Другие вопросы по тегам