Зачем токенизировать / обрабатывать слова для анализа языка? - PullRequest
0 голосов
/ 21 октября 2018

В настоящее время я работаю над анализатором твитов Python, и частью этого будет подсчет общих слов.Я видел несколько учебных пособий о том, как это сделать, и большинство токенизируют строки текста перед дальнейшим анализом.

Конечно, было бы легче избежать этой стадии предварительной обработки и считать слова непосредственно из строки -так зачем это делать?

Ответы [ 4 ]

0 голосов
/ 21 октября 2018

Токенизация - это простой способ понять лексику / словарь при обработке текста.

Основной первый шаг при анализе языка или шаблонов в тексте - удалить символы / знаки препинания и стоп-слова.С помощью токенизации вы можете разделить большие фрагменты текста, чтобы идентифицировать и удалить текст, который может не увеличивать ценность, во многих случаях такие стоп-слова, как «the», «a», «and» и т. Д., Не повышают ценность идентификацииИнтересные слова.

Частоты слова также очень распространены в понимании использования слов в тексте, Google Ngram позволяет анализировать язык и выявляет популярность / частоту слова за эти годы.Если вы не разбиваете токены или не разбиваете строки, у вас не будет основы для подсчета слов, которые появляются в тексте.

Токенизация также позволяет вам выполнить более сложный анализ, например, пометить часть речиили присваивать чувства определенным словам.Также для машинного обучения тексты в основном предварительно обрабатываются для преобразования их в массивы, которые используются в различных слоях нейронных сетей.Без токенизации все входные данные будут слишком отчетливыми, чтобы выполнить любой анализ.

0 голосов
/ 21 октября 2018

Попытка с этим предложением:

text = "We like the cake you did this week, we didn't like the cakes you cooked last week"

Считать напрямую без токенов nltk:

Counter(text.split())

Возвращает:

Counter({'We': 1,
     'cake': 1,
     'cakes': 1,
     'cooked': 1,
     'did': 1,
     "didn't": 1,
     'last': 1,
     'like': 2,
     'the': 2,
     'this': 1,
     'we': 1,
     'week': 1,
     'week,': 1,
     'you': 2})

Мы видим, что мы не счастливыс результатом.делали и не делали (что является сокращением не) считаются разными словами, поэтому были «неделя» и «неделя»

Это исправлено, когда вы токенизируете с использованием nltk (расщепление на самом деле однонаивный способ токенизации):

Counter(nltk.word_tokenize(text))

Возвращает

Counter({',': 1,
     'We': 1,
     'cake': 1,
     'cakes': 1,
     'cooked': 1,
     'did': 2,
     'last': 1,
     'like': 2,
     "n't": 1,
     'the': 2,
     'this': 1,
     'we': 1,
     'week': 2,
     'you': 2})

Если вы хотите считать одним и тем же словом «торт» и «пирожные», вы также можете лемматизировать:

Counter([lemmatizer.lemmatize(w).lower() for w in nltk.word_tokenize(text)])

Возвращает

Counter({',': 1,
     'cake': 2,
     'cooked': 1,
     'did': 2,
     'last': 1,
     'like': 2,
     "n't": 1,
     'the': 2,
     'this': 1,
     'we': 2,
     'week': 2,
     'you': 2})
0 голосов
/ 21 октября 2018

Возможно, я чересчур корректен, но разве токенизация не относится просто к разделению входного потока (в данном случае символов) на разделители для получения того, что рассматривается как «токен»?

Ваши токены могут быть произвольными: вы можете выполнять анализ на уровне слов, где ваши токены - это слова, а разделитель - любой пробел или знак пунктуации.Также вероятно, что вы анализируете n-граммы, где ваши токены соответствуют группе слов, а разграничение выполняется, например, путем скольжения окна.

Короче говоря, для анализа слов в потоке текставам нужно токенизировать, чтобы получить «необработанные» слова.Это становится совершенно ясным, если подумать об анализе настроений: если вы видите токены happy, happily и happiness, хотите ли вы относиться к каждому из них по отдельности или не хотите объединять ихв трех случаях happy, чтобы лучше передать более сильное понятие «быть счастливым»?

0 голосов
/ 21 октября 2018

Этот подход необходим для того, чтобы можно было определить, какое слово учитывает какое измерение в векторе, который численно представляет строку.Также иногда используется дополнительное редактирование, например строчные слова и удаление знаков препинания.Давайте рассмотрим следующий пример:

from collections import Counter
import re
sentence = 'This is just some sentence, which is nice.'
tokens = sentence.split(' ')
tokens = [re.sub(r'[,.]', '', t).lower() for t in tokens]
print(Counter(tokens))

# Output:
#   Counter({'is': 2, 'just': 1, 'nice': 1, 'sentence': 1, 'some': 1, 'this': 1, 'which': 1})

Предложение сначала разбивается на список, и символы ,, а также . удаляются, и проверяется, что строки в нижнем регистре.,Далее идет подсчет слов через Counter.Вы можете интерпретировать этот результат как вектор [2 1 1 1 1 1 1] (где 2 представляет is, 1 слово just и т. Д.).Если ваш словарь становится больше, потому что вы используете гораздо больший корпус, векторы становятся все более разреженными , что означает, что они содержат все больше и больше нулей, и содержащаяся в них информация может храниться в более сжатом видеway.

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

Вы можете попытаться представить данные выше в полуструктурированном формате данных , таком как JSON, но увидите, что это само по себе не слишком сжатое представление ваших данных.Этот подход можно сочетать с (не) сжатием данных перед загрузкой или после сохранения, но это повлечет за собой снижение производительности несколько раз, в то время как создание словаря будет стоить только одноразовые затраты.

...