Разработка текстовых функций — часть 2

искусственный интеллект

Особенности текста — часть 2

图片

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

图片

图片

图片

1. Лексические атрибутивные признаки

Каждое слово имеет свойства, которым оно принадлежит, например, является ли оно существительным, глаголом или прилагательным и т. д. Функция лексического атрибута часто может помочь модели немного улучшить эффект и может использоваться как своего рода дополнительная информация.

图片

2. Текстовые векторные признаки

Функция TDIDF может облегчить проблемы, вызванные высокочастотными лексическими особенностями функции частотности слов.В то же время стратегия N-Gram также может косвенно фиксировать отношения между словами в тексте, но сбор этой информации все еще плохо, и стратегия N-Gram также сделает словарь слишком большим, что вызовет проблемы с хранением. Однако векторные функции слов могут очень хорошо решить эти две проблемы.

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

图片

В настоящее время векторы слов можно извлекать с помощью Gensim. Поскольку мы извлекаем векторы на основе слов, а количество слов в разных текстах разное, нам, наконец, нужно преобразовать наши текстовые функции в функции того же размера с помощью некоторого преобразования. Наиболее распространены следующие две стратегии:

1. Расчет статистических характеристик, таких как среднее значение, медиана, дисперсия и т. д.; 

2. Сначала обрезать длину текста, дополнить недостающие нулями, а затем выполнить PCA, TSNE и другие преобразования;

В настоящее время существует множество стратегий, которые могут генерировать векторы слов, такие как Word2Vec, Glove и т. д., и многие последние предварительно обученные пакеты можно использовать напрямую.

import gensim.downloader as gensim_api
glove_model = gensim_api.load("glove-wiki-gigaword-300") 
word = "love"
glove_model[word]

图片

图片

3.HashVector

Будь то CounterVector, TfidfVectorizer или Word2Vector и другие методы вектора слов, нам нужно хранить таблицу сопоставления, что приведет к большому потреблению памяти, но нам все равно нужно кодировать документ в вектор, В это время нам нужно используйте HashVector, HashingVectorizer не сохраняет результирующий словарь, этот метод использует метод одностороннего хеширования для преобразования слов в целые числа, поэтому нам не нужен словарь, и мы можем выбрать произвольно длинный вектор фиксированной длины, что очень эффективно для больших наборов данных. Недостатком является то, что квантование хэша является односторонним, поэтому нет способа преобразовать кодировку обратно в слова, что не имеет значения во многих случаях обучения с учителем.

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

from sklearn.feature_extraction.text import HashingVectorizer
text = ["The quick brown fox jumped over the lazy dog."]
vectorizer = HashingVectorizer(n_features=20)
vector = vectorizer.transform(text)
print(vector.shape)
print(vector.toarray())
(1, 20)
[[ 0.          0.          0.          0.          0.          0.33333333
   0.         -0.33333333  0.33333333  0.          0.          0.33333333
   0.          0.          0.         -0.33333333  0.          0.
  -0.66666667  0.        ]]

图片

图片

4. Информация о языке текста

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

图片

import pandas as pd

import langdetect 

df = pd.DataFrame()
df['text'] = ['I love it.', '我喜欢你。', 'I think you are great!', 'OK!', '太棒了。', 'No pro.']
df['lang'] = df["text"].apply(lambda x: langdetect.detect(x) if 
                                 x.strip() != "" else "")
df
  text lang
0 I love it. sl
1 Ты мне нравишься. zh-cn
2 I think you are great! en
3 OK! en
4 чудесный. zh-cn
5 No pro. pt


图片

图片

5. Семантические признаки

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

Но обучение хорошей языковой модели очень трудоемко, если не хватает времени или данных, мы можем использовать предварительно обученные модели, такие как Textblob и Vader. Textblob построен на NLTK, одном из самых популярных языков, который присваивает словам полярность и оценивает настроение всего текста как среднее. Vader — это модель, основанная на правилах, которая в настоящее время больше используется для данных социальных сетей.

import pandas as pd
from textblob import TextBlob
df = pd.DataFrame()
df['text'] = ['I love it.', 'I hate you.', 'I think you are great!', 'She is beautiful.', 'Good!', 'No problem.']
df["sentiment"] = df['text'].apply(lambda x:  TextBlob(x).sentiment.polarity)
df.head()
  text sentiment
0 I love it. 0.500
1 I hate you. -0.800
2 I think you are great! 1.000
3 She is beautiful. 0.850
4 Good! 0.875
  • Из приведенных выше признаков мы находим, что эмоциональные признаки относительно надежны.

图片

图片

6. Специальные лексические признаки

Знаки препинания могут отражать такую ​​информацию, как эмоциональная насыщенность текста со стороны, и играть важную роль в классификации тональностей и классификации текстов, конечно, при этом более важны характеристики специальных слов. В зависимости от задачи специальная лексика будет сильно различаться.Возьмем несколько простых примеров:

  • Проблема классификации тональности текста

图片

Мы можем напрямую классифицировать (каждая категория эмоций представляет одну категорию) и подсчитывать количество вхождений слов в каждой категории.

  • Проблемы с обнаружением вирусов в коде

图片

Информация о ключевом слове кода особенно важна.Например, специальные слова, такие как снимки экрана, сеть и отправка, предоставят нам важную основу для оценки того, содержит ли файл кода вирусы.

图片

图片

7. Особенности НЭР

Распознавание именованных объектов (NER) — это процесс пометки именованных объектов, упомянутых в неструктурированном тексте, предопределенными категориями, такими как имена людей, места, организации и т. д. Эти важные именованные сущности полезны в самых разных задачах. Например, чтобы определить вероятность того, что пользователь нажмет на рекламу и т. д., представитель в рекламе может быть идентифицирован с помощью NER, а вероятность того, что пользователь нажмет на рекламу, может быть определена в соответствии с предпочтениями представителя и пользователя. . Наиболее часто используемые наборы инструментов NER:SpaCy, о том, сколько различных именованных сущностей в настоящее время может обрабатывать NER, заинтересованные друзья могут взглянуть на набор инструментов Spacy.

图片

 

В дополнение к прямому извлечению нужных нам функций NER, SpaCy также может выделить их, как показано ниже.图片

import spacy
import pandas as pd
# !pip install zh_core_web_sm-3.0.0-py3-none-any.whl
ner = spacy.load("zh_core_web_sm")
df = pd.DataFrame()
df['txt'] = ['','我喜欢四川。','成都的女孩喜欢吃辣。']
df["tags"] = df["txt"].apply(lambda x: [(tag.text, tag.label_)   for tag in ner(x).ents] )
df 
  txt tags
0 На станции Уси я встретил вас из Нанкина. [(Станция Уси, FAC), (Нанкин, GPE)]
1 Мне нравится Сычуань. [(Сычуань, GPE)]
2 Девушки в Чэнду любят острую пищу. [(Чэнду, GPE)]
txt = '在无锡车站,我遇见了来自南京的你。但没想到你那么喜欢吃四川的火锅。'
doc = ner(txt)
## display result
spacy.displacy.render(doc, style="ent")

 

На станции FAC в Уси я встретил вас из Nanjing GPE. Но я не ожидал, что вам так понравится горячий горшок Sichuan GPE.

图片

图片

8.K функции ближайших соседей

Помимо тематической модели LDA, наиболее производными признаками, которые мы делаем на основе векторов, являются признаки сходства. Мы находим N ближайших текстов к каждому тексту и используем идентификаторы, соответствующие ближайшим N текстам, и их расстояния от текущего текста в качестве наших новых признаков.

图片

Метод расчета расстояния может быть евклидовым, косинусным и т. д. В зависимости от расстояния может быть множество признаков подобия текста.

from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(tfidf_matrix)
similarity_matrix
array([[1.        , 0.36651513, 0.52305744, 0.13448867],
       [0.36651513, 1.        , 0.72875508, 0.54139736],
       [0.52305744, 0.72875508, 1.        , 0.43661098],
       [0.13448867, 0.54139736, 0.43661098, 1.        ]])

图片

图片

9. Функции кластеризации

Функция кластеризации часто используется вместе с функцией K-ближайшего соседа. Точно так же, поскольку существует множество способов кластеризации функций, наиболее распространенными являются K-средние и т. д. Здесь мы перечисляем две общие функции кластеризации.

图片

  • Kmeans кластеризация
from sklearn.cluster import KMeans
km = KMeans(n_clusters=2)
km.fit_predict(tfidf_matrix)
array([0, 1, 1, 1], dtype=int32)
  • кластеризация иерархии
from scipy.cluster.hierarchy import dendrogram, linkage

Z = linkage(tfidf_matrix, 'ward')
pd.DataFrame(Z, columns=['Document\Cluster 1', 'Document\Cluster 2', 
                         'Distance', 'Cluster Size'], dtype='object')
  Document\Cluster 1 Document\Cluster 2 Distance Cluster Size
0 1 2 0.736539 2
1 3 4 1.08712 3
2 0 5 1.24292 4
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 3))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Data point')
plt.ylabel('Distance')
dendrogram(Z)
plt.axhline(y=1.0, c='k', ls='--', lw=0.5)
<matplotlib.lines.Line2D at 0x7ff7d99f0580>
from scipy.cluster.hierarchy import fcluster
max_dist = 1.0

cluster_labels = fcluster(Z, max_dist, criterion='distance')
cluster_labels = pd.DataFrame(cluster_labels, columns=['ClusterLabel'])
cluster_labels
  ClusterLabel
0 3
1 1
2 1
3 2


图片

图片

10. Резюме

В настоящее время проблемы, связанные с текстом, в основном основаны на DeepLearning, но многие из вышеперечисленных функций очень важны и могут быть добавлены к обучению модели как Dense-сторонние функции нейронной сети или непосредственно извлечены в модель дерева повышения градиента для обучение, Это может принести хорошее улучшение, потому что в этой серии мы сосредоточимся на моделировании модели дерева, повышающей градиент, Если вас интересуют многие стратегии обучения DeepLearning, вы можете прочитать соответствующие статьи и изучить самостоятельно.

использованная литература