练手扎实基本功必备:非结构文本特征提取方法
作者 | Dipanjan (DJ) Sarkar
编译 | ronghuaiyang
来源 | AI公园(ID:AI_Paradise)
【导读】本文介绍了一些传统但是被验证是非常有用的,现在都还在用的策略,用来对非结构化的文本数据提取特征。
介绍
动机
理解文本数据
特征工程策略
import pandas as pd import numpy as np import re import nltk import matplotlib.pyplot as plt pd.options.display.max_colwidth = 200 %matplotlib inline
corpus = ['The sky is blue and beautiful.', 'Love this blue and beautiful sky!', 'The quick brown fox jumps over the lazy dog.', "A king's breakfast has sausages, ham, bacon, eggs, toast and beans", 'I love green eggs, ham, sausages and bacon!', 'The brown fox is quick and the blue dog is lazy!', 'The sky is very blue and the sky is very beautiful today', 'The dog is lazy but the brown fox is quick!' ] labels = ['weather', 'weather', 'animals', 'food', 'food', 'animals', 'weather', 'animals'] corpus = np.array(corpus) corpus_df = pd.DataFrame({'Document': corpus, 'Category': labels}) corpus_df = corpus_df[['Document', 'Category']]
文本预处理
- 删除标签:我们的文本经常包含不必要的内容,如HTML标签,分析文本的时候这不会增加多少价值。BeautifulSoup库可以帮我们做很多必须的工作。
- 删除重音字符:在任何文本语料库中,特别是在处理英语时,通常可能要处理重音字符/字母。因此,我们需要确保将这些字符转换并标准化为ASCII字符。一个简单的例子是将é转换为e。
- 扩展缩略语:在英语中,缩略语基本上是单词或音节的缩写形式。这些现有单词或短语的缩略形式是通过删除特定的字母和声音来创建的。例如,do not变为don 't以及I would 变为I 'd 。将每个缩略语转换为其扩展的原始形式通常有助于文本标准化。
- 删除特殊字符:非字母数字字符的特殊字符和符号通常会增加非结构化文本中的额外噪音。通常,可以使用简单正则表达式(regexes)来实现这一点。
- 词根提取和词形还原:词干通常是可能的单词的基本形式,可以通过在词干上附加词缀,如前缀和后缀来创建新单词。这就是所谓的拐点。获取单词基本形式的反向过程称为“词根提取”。一个简单的例子是单词WATCHES, WATCHING,和WATCHED。它们以词根WATCH作为基本形式。词形还原与词根提取非常相似,在词根提取中,我们去掉词缀以得到单词的基本形式。然而,在这种情况下,基本形式被称为根词,而不是词根。不同之处在于,词根总是一个词典上正确的单词(存在于字典中),但根词的词干可能不是这样。
- 删除停止词:在从文本中构造有意义的特征时,意义不大或者没有意义的词被称为停止词或停止词。如果你在语料库中做一个简单的词或词的频率,这些词的频率通常是最高的。像a、an、the、and等词被认为是停止词。没有一个通用的停止词列表,但是我们使用了一个来自“nltk”的标准英语停止词列表。你还可以根据需要添加自己的域特定的停止词。
wpt = nltk.WordPunctTokenizer() stop_words = nltk.corpus.stopwords.words('english') def normalize_document(doc): # lower case and remove special characters\whitespaces doc = re.sub(r'[^a-zA-Z\s]', '', doc, re.I|re.A) doc = doc.lower() doc = doc.strip() # tokenize document tokens = wpt.tokenize(doc) # filter stopwords out of document filtered_tokens = [token for token in tokens if token not in stop_words] # re-create document from filtered tokens doc = ' '.join(filtered_tokens) return doc
norm_corpus = normalize_corpus(corpus) norm_corpus Output ------ array(['sky blue beautiful', 'love blue beautiful sky', 'quick brown fox jumps lazy dog', 'kings breakfast sausages ham bacon eggs toast beans', 'love green eggs ham sausages bacon', 'brown fox quick blue dog lazy', 'sky blue sky beautiful today', 'dog lazy brown fox quick'], dtype='<U51')
词袋模型
from sklearn.feature_extraction.text import CountVectorizer cv = CountVectorizer(min_df=0., max_df=1.) cv_matrix = cv.fit_transform(norm_corpus) cv_matrix = cv_matrix.toarray() cv_matrix
Output ------ array([[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0], [1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1], [0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0] ], dtype=int64)
# get all unique words in the corpus vocab = cv.get_feature_names() # show document feature vectors pd.DataFrame(cv_matrix, columns=vocab)
N-Grams袋模型
# you can set the n-gram range to 1,2 to get unigrams as well as bigrams bv = CountVectorizer(ngram_range=(2,2)) bv_matrix = bv.fit_transform(norm_corpus) bv_matrix = bv_matrix.toarray() vocab = bv.get_feature_names() pd.DataFrame(bv_matrix, columns=vocab)
TF-IDF模型
文档相似度
from sklearn.metrics.pairwise import cosine_similarity similarity_matrix = cosine_similarity(tv_matrix)
similarity_df = pd.DataFrame(similarity_matrix)
similarity_df
使用相似特征对文档进行聚类
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)
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'])
pd.concat([corpus_df, cluster_labels], axis=1)
总结
◆
精彩推荐
◆
推荐阅读
鸿蒙 OS 的到来,能为我们改变什么?
干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作
周杰伦的《说好不哭》,20万点评Python来分析
算法人必懂的进阶SQL知识,4道面试常考题
6张拓扑图揭秘中心化交易所的5种行为, 原来中心化比你想象的重要
分布式存储春天已来Storj首登top10; Cardano排名上升; 以太坊比特币活跃地址双下降 | 数据周榜
华为愿出售5G技术渴望对手;苹果将向印度投资10亿美元;华为全联接大会首发计算战略;腾讯自研轻量级物联网操作系统正式开源……
TDD 就是个坑
厉害!接班马云的为何是张勇?
你点的每个“在看”,我都认真当成了喜欢“
练手扎实基本功必备:非结构文本特征提取方法相关推荐
- 数据挖掘-文本特征提取方法研究
一. 课题背景概述 文本挖掘是一门交叉性学科,涉及数据挖掘.机器学习.模式识别.人工智能.统计学.计算机语言学.计算机网络技术.信息学等多个领域.文本挖掘就是从大量的文档中发现隐含知识和模式的一种方法 ...
- 【自然语言处理与文本分析】文本特征提取方法总结。关键词提取方法。公认效果较好的IDF,RCF。
关键词提取方法 关键词是文章想表达的主要画图,能反映文本语料主题的词语或者短语. 关键词具有的特定: 关键词在特点的语料里频繁出现,,在其他语料里出现较少:IDF 针对一些有结构的文本,比如新闻之类的 ...
- Self-Attentive 基于自注意力分类的非结构化日志异常检测
原文:Self-Attentive Classification-Based Anomaly Detection in Unstructured Logs 理解:使用目标数据集和辅助数据集训练,使目标 ...
- 小世界网络模型代码 c 语言,新的小世界网络模型实现文本特征的提取方法与流程...
本发明涉及语义网络技术领域,具体涉及新的小世界网络模型实现文本特征的提取方法. 背景技术: 目前常用的文本特征提取方法,包括词频-反文档频率方法-TF-IDF.信息增益方法.互信息等方法:TF-IDF ...
- NLP:自然语言处理技术中常用的文本特征表示方法(整数编码、one-hot编码法、BOW法、TF-IDF法、N-Gram法等)及其代码案例实现
NLP:自然语言处理技术中常用的文本特征表示方法(整数编码.one-hot编码法.BOW法.TF-IDF法.N-Gram法等)及其代码案例实现 目录 自然语言处理技术中常用的文本特征表示方法(整数编码 ...
- python简单项目-4个Python经典项目实战,练手必备哦!
Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置, ...
- 4个Python经典项目实战,练手必备哦
Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置, ...
- 非结构化商业文本中隐私信息识别-第2名方案(含数据)
向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习 公众号:datayx 随着社交网络.移动通讯等技术的迅速发展,网络中存在大量包含隐私数据的文本信息,如何在非结构化 ...
- 使用爬虫爬取两种数据:结构化/非结构化文本
一.非结构化文本的爬取 微博上有一篇关于"#学校里的男生有多温柔#"的话题,点进去一看感觉评论很真实,于是想把评论给爬下来看一看,并生成词云.刚开始思路是通过网页端微博爬取,通过开 ...
最新文章
- ubuntu18 搜狗输入法 解决版
- linux系统qt中make安装,Linux系统下Qt的基本安装和配置
- 《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍
- 给书配代码-电力经济调度(3):计及网络安全约束的经济调度模型
- Storm的通信机制
- Leetcode--781.森林中的兔子
- python自定义修饰器_Python概述
- JUnit5 Maven 依赖项
- python 连续等于
- Ubuntu操作U盘相关
- QT的信号与槽机制介绍
- Android隐藏应用桌面图标/动态修改桌面图标
- 红绿3d眼镜与红蓝3d眼镜区别_3D眼镜是指什么原理?
- [unity]调用手机摄像头
- 绕过AppLocker系列之弱路径规则的利用
- NAO学习第二周——NAOqi Audio
- 3.6.3 获取分区的读取偏移量
- Cocos Creator 基于 Spine 动画的 AVATAR 换装系统优化
- mycat原理及分表分库入门
- JSP连接数据库实现注册登录(附带上传头像)
热门文章
- C语言 · 征税程序
- 写时复制,写时拷贝,写时分裂,Copy on write
- Android媒体相关开发应用程序接口
- “80后”财富新贵创业秘诀
- 计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续1)
- Java Optional类源码解析和用法
- java实现多线程的方式并源码分析
- linux socket完成端口,“完成端口”模型(IOCP)
- 为什么java退出全屏_Java全屏模式与退出全屏:
- c语言关闭其他进程tcp_tcp链接迁移