Особенности текста — часть 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, вы можете прочитать соответствующие статьи и изучить самостоятельно.
использованная литература