现代公司需要处理海量的数据,这些数据以多种形式存在,包括文档、电子表格、录音、电子邮件、JSON等。这类数据中最常用的形式之一是文本,这种文本与我们日常使用的自然语言非常相似。
自然语言处理(NLP)是研究如何通过计算机编程处理和分析大量自然语言文本的技术。对于数据科学家而言,掌握NLP知识至关重要,因为文本是数据存储中非常常见且易于使用的媒介。
在处理文本数据进行分析和建模时,我们需要明确如何执行基础的数据科学任务,如数据清洗、格式化、解析、分析、可视化和建模。在数据仍处于原始状态时,除了常规方法,还需要一些额外的步骤。
本文将简要介绍在数据科学中应用自然语言处理的基础知识,并重点介绍七种常用技术,包括NLTK和Scikit-Learn等工具。
分词是指将文本切分为句子或单词,同时移除标点符号和其他多余符号。这一过程看似简单,但需要特别注意某些特殊情况,比如地名“纽约(New York)”应被视为一个整体,而不是两个独立的标记。分词有助于将文本转换为更适合处理的格式,是文本数据分析的第一步。
python
import nltk
sentence = "My name is George and I love NLP"
tokens = nltk.word_tokenize(sentence)
print(tokens)
分词之后,下一步是去除停用词。这些停用词包括“and”、“the”、“a”等常见介词,去除这些词可以使分析更加聚焦于有意义的词汇。去除停用词可以通过比对预定义列表来实现,但停用词列表通常是根据具体应用场景定制的。
```python import nltk from nltk.corpus import stopwords
sentence = "This is a sentence for removing stop words" tokens = nltk.word_tokenize(sentence)
stopwords = set(stopwords.words('english')) filteredtokens = [w for w in tokens if w not in stopwords] print(filteredtokens) ```
词干提取是另一种文本清洗技术,它将单词还原为词根形式,以统一处理因上下文而略有不同的同义词。例如,单词“cook”及其变体“cooks”、“cooked”、“cooking”都可以被标记为“cook”。
```python import nltk
stemmer = nltk.stem.SnowballStemmer('english')
s1 = stemmer.stem("cook") s2 = stemmer.stem("cooks") s3 = stemmer.stem("cooked") s4 = stemmer.stem("cooking") ```
在完成数据清洗后,我们可以将文本数据转换为可用于实际处理的格式。词嵌入是一种将单词表示为数值向量的技术,使得具有相似含义的单词在向量空间中也彼此接近。GloVe是一种常用的词嵌入技术,通过共现矩阵来捕捉单词间的统计关系。
```python import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer
def gettfidf(vectors): featurenames = vectors.getfeaturenames() densevec = vectors.todense() denselist = densevec.tolist() tfidfdata = pd.DataFrame(denselist, columns=featurenames) return tfidfdata
vectorizer = TfidfVectorizer()
doc1 = "TF-IDF uses statistics to measure how important a word is to a particular document" doc2 = "The TF-IDF is perfectly balanced, considering both local and global levels of statistics for the target word." doc3 = "Words that occur more frequently in a document are weighted higher, but only if they're more rare within the whole document." documentslist = [doc1, doc2, doc_3]
vectors = vectorizer.fittransform(documentslist)
tfidfdata = gettfidf(vectors) print(tfidfdata) ```
TF-IDF是一种加权因子,用于衡量单词在特定文档中的重要性。TF-IDF结合了词频(TF)和逆文档频率(IDF),以平衡单词的局部和全局统计信息。TF-IDF广泛应用于信息检索和文本挖掘。
```python import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer
def gettfidf(vectors): featurenames = vectors.getfeaturenames() densevec = vectors.todense() denselist = densevec.tolist() tfidfdata = pd.DataFrame(denselist, columns=featurenames) return tfidfdata
vectorizer = TfidfVectorizer()
doc1 = "TF-IDF uses statistics to measure how important a word is to a particular document" doc2 = "The TF-IDF is perfectly balanced, considering both local and global levels of statistics for the target word." doc3 = "Words that occur more frequently in a document are weighted higher, but only if they're more rare within the whole document." documentslist = [doc1, doc2, doc_3]
vectors = vectorizer.fittransform(documentslist)
tfidfdata = gettfidf(vectors) print(tfidfdata) ```
主题建模是从文本数据中提取主要话题的过程,本质上是一种降维技术。主题建模在许多数据科学场景中都有应用,如文本数据分析、文本分类和推荐系统构建。
主题建模通常通过隐含狄利克雷分布(LDA)来实现。LDA将文本文档建模为主题分布,主题建模可以自动将文本数据分组,并为构建和训练模型提供基础功能。
```python from sklearn.decomposition import LatentDirichletAllocation as LDA
NUM_TOPICS = 3
lda = LDA(ncomponents=NUMTOPICS, njobs=-1) lda.fit(documentword_matrix) ```
情感分析是一种自然语言处理技术,旨在识别和提取文本数据中的主观信息。情感分析可以将非结构化的文本转换为嵌入在数据中的信息摘要。大多数情感分析技术分为基于规则和机器学习两种方法。基于规则的方法需要手动定义情感单词列表,而基于机器学习的方法则通过深度学习或传统机器学习技术自动进行情感分类。
```python import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer
def gettfidf(vectors): featurenames = vectors.getfeaturenames() densevec = vectors.todense() denselist = densevec.tolist() tfidfdata = pd.DataFrame(denselist, columns=featurenames) return tfidfdata
vectorizer = TfidfVectorizer()
doc1 = "TF-IDF uses statistics to measure how important a word is to a particular document" doc2 = "The TF-IDF is perfectly balanced, considering both local and global levels of statistics for the target word." doc3 = "Words that occur more frequently in a document are weighted higher, but only if they're more rare within the whole document." documentslist = [doc1, doc2, doc_3]
vectors = vectorizer.fittransform(documentslist)
tfidfdata = gettfidf(vectors) print(tfidfdata) ```
以上介绍了在数据科学中应用自然语言处理的七种常用技术,这些技术可以帮助我们更好地理解和处理文本数据。