自然语言处理(NLP)是指利用计算机对文本进行处理的技术及相关应用。在处理文本数据时,我们通常会花费大量时间在文本预处理上。中文和英文的预处理流程有所不同,本文将总结中英文文本挖掘中常用的NLP文本预处理技术。
中英文文本预处理的主要流程虽然相似,但存在一些差异。中文文本不像英文那样通过空格分隔单词,因此不能直接通过空格和标点符号完成分词。通常需要使用分词算法来完成这一任务。另一方面,英文文本预处理也有一些特殊之处,例如拼写检查、词干提取和词形还原。这些步骤有助于将单词还原到其基本形态,以便更好地进行文本分析。
文本数据可以通过两种方式获取: 1. 使用已有的数据集或第三方语料库,例如维基百科。 2. 自行爬取数据。如果研究对象属于特定领域,开放语料库可能无法满足需求,这时就需要使用爬虫技术获取所需信息。常用的爬虫工具包括BeautifulSoup和Scrapy。
文本数据中常常包含HTML标签和其他非文本内容,需要通过正则表达式进行清理。例如,可以使用Python的re模块来移除这些内容。
```python import re
r1 = u'[a-zA-Z0-9’!"#$%&'()+,-./:;<=>?@,。?★、…【】《》?“”‘’![]^_`{|}~]+' r2 = "[s+.!/_,$%^(+"']+|[+——!,。=?、:“”‘’¥……()]+" r3 = "[.!//_,$&%^*()<>+"'?@|:~{}]+|[——!,。=?、:“”‘’¥……()《》【】]+"
sentence = "hello! wo?rd!." cleanr = re.compile('<.*?>') sentence = re.sub(cleanr, ' ', sentence) # 移除HTML标签 sentence = re.sub(r3, '', sentence) print(sentence) ```
英文文本分词相对简单,只需使用split()函数即可。中文分词则需要借助工具,如结巴分词。安装方法也非常简单,使用pip install jieba即可。
```python import jieba
sentence = "我们学习人工智能" sentenceseg = jieba.cut(sentence) result = ' '.join(sentenceseg) print(result) ```
停用词是指那些在文本分析中无实际意义的词汇,例如冠词和代词。去除这些词汇可以简化文本,提高分析效率。英文停用词可以使用nltk库中的停用词表,而中文停用词需要自行构建。
```python import nltk from nltk.corpus import stopwords
nltk.download()
stopwords = set(stopwords.words('english')) sentence = "this is a apple" filteredsentence = [w for w in sentence.split(' ') if w not in stopwords] print(filteredsentence) ```
英文文本预处理中,词干提取和词形还原是常见的步骤。词干提取可能会得到不是标准词汇的形式,而词形还原则更加保守,确保得到正确的词根。nltk库提供了这两种方法,其中WordNetLemmatizer较为常用。
```python from nltk.stem import SnowballStemmer from nltk.stem import WordNetLemmatizer
stemmer = SnowballStemmer("english") print(stemmer.stem("leaves")) # 输出 "leav"
wnl = WordNetLemmatizer() print(wnl.lemmatize('leaves')) # 输出 "leaf" ```
英文文本中大小写会影响单词的数量,将所有单词转换为小写可以减少重复项。
python
word = "Python"
word = word.lower() # 输出 "python"
print(word)
文本预处理完成后,可以使用sklearn库中的方法进行特征提取,如词袋模型、TF-IDF、N-gram、Word2Vec等。接下来将简要介绍Tf-idf、Bigram和Word2Vec的使用方法。
TF-IDF是一种基于词频的文本向量化方法,它考虑了词汇在整个语料库中的频率分布。
python
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["This is sample document.", "another random document.", "third sample document text"]
vectorizer = TfidfVectorizer()
tfidf_data = vectorizer.fit_transform(corpus)
print(tfidf_data.toarray())
print(vectorizer.vocabulary_)
N-gram模型是一种考虑单词顺序的语言模型,常用的有Bi-gram和Tri-gram。
```python from sklearn.feature_extraction.text import CountVectorizer import pandas as pd import jieba
data = ["为了祖国,为了成功,向我开炮!向我开炮!", "记者:你怎样会说出那番话", "我只是觉得,对准我本人打"] data = [" ".join(jieba.lcut(e)) for e in data] # 分词,并用" "连接 vectorizer = CountVectorizer(ngramrange=(2, 2)) # Bigram X = vectorizer.fittransform(data) print(vectorizer.vocabulary_) print(X.toarray()) ```
Word2Vec是一种将文本中的词映射到连续向量空间的方法,可以捕捉词与词之间的关系。通过计算句子中词向量的平均值,可以表示整个句子的向量。
```python from gensim.models import Word2Vec import numpy as np
data = ["I love deep learning", "I love studying", "I want to travel"] trainw2v = Word2Vec(data, mincount=5, size=50, workers=4)
avgdata = [] for row in data: vec = np.zeros(50) count = 0 for word in row.split(): if word in trainw2v.wv: vec += trainw2v[word] count += 1 if count > 0: vec /= count avgdata.append(vec)
print(avg_data[1]) ```
本文总结了中英文文本预处理的主要步骤和技术,包括数据收集、文本清洗、分词、停用词去除、词干提取、词形还原、大小写转换以及特征提取等。这些步骤对于后续的文本分析和机器学习建模至关重要。