自然语言处理(NLP)是一种流行的机器学习技术,它被广泛用于分析文本内容。在商业智能领域,许多公司利用这些洞察来推动业务发展。这些洞察和报告大多是基于结构化数据创建的,但也有一些用例涉及到非结构化数据,比如文本、推文、图像等。NLP专注于从这些基于文本的源中提取有意义的见解。
NLP的一些应用实例包括情感分析。假设是一家新推出了产品的公司,可以通过分析用户在推特上的情感来了解他们对产品的看法。同样,网站上的产品评论也可以用同样的方法进行分析。
那么,这里的挑战是什么呢?让以一个评论为例:“这个产品非常糟糕”。“非常”通常是一个正面的词汇。如果使用基于关键词的方法,并用“非常”这个词来标记它,那么就会是错误的。这就是NLP发挥作用的地方。在这些使用矛盾修饰法的情况下,需要小心处理。
另一个挑战是相似词汇以及模糊含义的处理。讽刺和挖苦对于机器来说很难理解。
NLP的一些优势包括:能够处理非结构化数据;更深入地了解客户的情感;聊天机器人和其他基于AI/ML的设备/技术正在不断改进。
让来看一下使用新闻文章数据集运行一个简单的NLP算法所涉及的基本步骤。已经导入了这个数据处理所需的库。之后,从本地系统导入了文件。可以看到文件的样子。每一行都有一个新闻文章,包含一些文本以及一个索引值。
import gensim
import numpy
from gensim.utils import simple_preprocess
from gensim.parsing.preprocessing import STOPWORDS
from nltk.stem import WordNetLemmatizer, SnowballStemmer
from nltk.stem.porter import *
import numpy as np
np.random.seed(2018)
import nltk
nltk.download('wordnet')
import pandas as pd
data = pd.read_csv('C:\\Users\\ktk\\Desktop\\BBC News Test.csv', error_bad_lines=False);
data
data_text = data[['Text']]
data_text['index'] = data.ArticleId
documents = data_text
这是数据预处理的第一步。那么这一步是做什么的呢?想象有一份100字的文档。需要将文档分成100个单独的单词,以便识别关键词和主要话题。这个过程被称为分词。使用了一个例子,其中导入了数据集,并使用了gensim库来完成所有预处理步骤。
这个库有一个预处理函数,帮助分词关键词。使用了一个叫做preprocess的函数来帮助挑选关键词。不同的库有不同的函数来完成这个过程。
processed_docs = documents['Text'].map(preprocess)
processed_docs[:10]
还可以在同一步骤中移除标点符号。也有相应的函数。由于这个特定数据集没有标点符号,没有使用移除标点符号的函数。
有大量的数据集或多篇文章。在这些文章中,会发现很多像“是”,“是”,“是”等词。这些词技术上不会给主题增加任何价值。它们被标记为停用词。有许多停用词移除技术可以用来移除这些停用词。这将帮助聚焦主题。
import nltk
from nltk.corpus import stopwords
print(stopwords.words('english'))
stop_words = stopwords.words('english')
output = [w for w in processed_docs if not w in stop_words]
print("n"+str(output[0]))
使用了NLTK库中存在的停用词函数。第一个列表包含系统考虑的停用词列表。第二个列表包含移除停用词后的词列表。一旦移除了停用词,就只剩下关键词。这一步对任何NLP处理都很重要。
词干提取意味着剪掉单词的其他部分,只保留词干(即单词的重要部分)。在英语中,添加前缀和后缀来形成不同的单词/同一单词的不同时态形式。
例如,根词干可以采取词干提取或词干的形式。词干提取过程将移除后缀,给出单词——词干。在下面的代码片段中执行了词干提取和下面步骤中解释的词形还原过程。可以注意到单词“queens”被词干提取为“queen”。
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
ps = PorterStemmer()
a = doc_sample.split(' ')
for w in a:
print(w, " : ", ps.stem(w))
另一个例子是单词生态系统。这个词的根词是“eco”,而派生词是“ecosystem”。不需要是一个语法专家来执行词干提取。Python有支持词干提取过程的库。
词形还原与词干提取类似,但在复杂性上有所不同。词干提取简单地剪掉前缀或后缀,不考虑剩余的根词是否有意义。另一方面,词形还原查看被提取的词,检查它是否有意义。
例如,单词“care”在词干提取后会给出“car”,但在词形还原后会给出“care”。根词care被称为词元。
那么,为什么词形还原非常重要呢?词形还原有助于消除单词的歧义。它揭示了单词的实际含义。因此,如果有多个共享相似含义的单词,词形还原可以帮助解决这个问题。因此,这是NLP过程中一个非常重要的步骤。
def lemmatize_stemming(text):
snow_stemmer = SnowballStemmer(language='english')
return snow_stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v'))
def preprocess(text):
result = []
for token in gensim.utils.simple_preprocess(text):
if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:
result.append(lemmatize_stemming(token))
return result
doc_sample = documents[documents['index'] == 1018].values[0][0]
print('original document: ')
words = []
for word in doc_sample.split(' '):
words.append(word)
print(words)
print('nn tokenized and lemmatized document: ')
print(preprocess(doc_sample))
可以看到用于词干提取和词形还原的步骤,这里使用了Snowball词干提取器来完成这个过程。
如果想要找出文本的核心思想,对文本进行建模是非常重要的。在监督机器学习的情况下,使用逻辑回归或线性回归等来建模数据。在这些情况下,有输出变量,用它来训练模型。在这种情况下,由于没有输出变量,依赖于无监督技术。
有许多好的算法可以帮助建模文本数据。两个最常用的是SVD(奇异值分解)和LDA(潜在狄利克雷分配)。这些在业界被广泛使用,并且相对容易理解和实现。
LDA是一个关注迭代分配单词属于主题的概率的算法。在这里使用LDA来识别文章可能的主题。
lda_model = gensim.models.LdaMulticore(bow_corpus, num_topics=10, id2word=dictionary, passes=2, workers=2)
在这里,可以看到每个文章的概率被列出。每个关键词都有一个值,表示单词成为关键词的可能性。
列出的是NLP的一些关键步骤。NLP本身就是一个维度。要完全理解它的范围,首先需要理解任何语言可以有多深。由于NLP侧重于基于语言的文本数据,讽刺、挖苦、喜剧、创伤、恐怖等都需要考虑。