Уменьшает ли механизм лемматизации размер корпуса?

Уважаемые участники сообщества,

Во время предварительной обработки данных, после разделения raw_data на токены, я использовал популярный WordNet Lemmatizer для создания стеблей. Я провожу эксперименты с набором данных, содержащим 18953 токена.

Мой вопрос: уменьшает ли процесс лемматизации размер корпуса? Я в замешательстве, пожалуйста, помогите в этом отношении. Любая помощь приветствуется!


person M S    schedule 21.08.2018    source источник
comment
Это не должно уменьшать количество токенов, но, возможно, набор токенов   -  person grshankar    schedule 21.08.2018
comment
Хорошо Спасибо за ответ.   -  person M S    schedule 21.08.2018


Ответы (1)


Лемматизация преобразует каждый токен (он же form) в предложении в его форму леммы (он же type):

>>> from nltk import word_tokenize
>>> from pywsd.utils import lemmatize_sentence

>>> text = ['This is a corpus with multiple sentences.', 'This was the second sentence running.', 'For some reasons, there is a need to second foo bar ran.']

>>> lemmatize_sentence(text[0]) # Lemmatized sentence example.
['this', 'be', 'a', 'corpus', 'with', 'multiple', 'sentence', '.']
>>> word_tokenize(text[0]) # Tokenized sentence example. 
['This', 'is', 'a', 'corpus', 'with', 'multiple', 'sentences', '.']
>>> word_tokenize(text[0].lower()) # Lowercased and tokenized sentence example.
['this', 'is', 'a', 'corpus', 'with', 'multiple', 'sentences', '.']

Если мы лемматизируем предложение, каждая лексема должна получить соответствующую форму леммы, поэтому нет. "слов" остается одинаковым, будь то form или type:

>>> num_tokens = sum([len(word_tokenize(sent.lower())) for sent in text])
>>> num_lemmas = sum([len(lemmatize_sentence(sent)) for sent in text])
>>> num_tokens, num_lemmas
(29, 29)


>>> [lemmatize_sentence(sent) for sent in text] # lemmatized sentences
[['this', 'be', 'a', 'corpus', 'with', 'multiple', 'sentence', '.'], ['this', 'be', 'the', 'second', 'sentence', 'running', '.'], ['for', 'some', 'reason', ',', 'there', 'be', 'a', 'need', 'to', 'second', 'foo', 'bar', 'ran', '.']]

>>> [word_tokenize(sent.lower()) for sent in text] # tokenized sentences
[['this', 'is', 'a', 'corpus', 'with', 'multiple', 'sentences', '.'], ['this', 'was', 'the', 'second', 'sentence', 'running', '.'], ['for', 'some', 'reasons', ',', 'there', 'is', 'a', 'need', 'to', 'second', 'foo', 'bar', 'ran', '.']]

«Сжатие» само по себе будет относиться к количеству уникальных токенов, представленных во всем корпусе после того, как вы лемматизировали предложения, например.

>>> lemma_vocab = set(chain(*[lemmatize_sentence(sent) for sent in text]))
>>> token_vocab = set(chain(*[word_tokenize(sent.lower()) for sent in text]))
>>> len(lemma_vocab), len(token_vocab)
(21, 23)

>>> lemma_vocab
{'the', 'this', 'to', 'reason', 'for', 'second', 'a', 'running', 'some', 'sentence', 'be', 'foo', 'ran', 'with', '.', 'need', 'multiple', 'bar', 'corpus', 'there', ','}
>>> token_vocab
{'the', 'this', 'to', 'for', 'sentences', 'a', 'second', 'running', 'some', 'is', 'sentence', 'foo', 'reasons', 'with', 'ran', '.', 'need', 'multiple', 'bar', 'corpus', 'there', 'was', ','}

Примечание. Лемматизация — это этап предварительной обработки. Но он не должен перезаписывать исходный корпус лемматизированными формами.

person alvas    schedule 23.08.2018
comment
Альвас большое спасибо. Это помогает. - person M S; 23.08.2018