在上一节《Tokenization - NLP(1)》的学习中,我们主要学习了如何将一串字符串分割成单独的字符,并且形成一个词汇集(vocabulary),之后我们将形成的词汇集合转换成计算机可以处理的数字信息,以方便我们做进一步文本分析。这篇博客的主题还是我们如何将文本转成成更有用的成分,让我们能从文本当中提取到更多的信息以便作为特征输入到模型中训练,首先会介绍一下N-grams算法,之后会提到停顿词及英文文本常见的标准化处理手段,如大小写的改变、词干提取等(文章中的某些例子会涉及到正则表达式的使用,但是因为不是主要的内容,对使用到的正则表达式不做过多解释,如果有需要的话自己找下书籍和在网上搜索下如何使用正则表达式)。
一、N-grams
自然语言处理过程中,一个值得我们注意的是,如果我们仅仅是将文本字符串分割成单独的文本,此时我们只是简单的去分析文本中每个字符所代表的潜在意义与我们需要分析的结果的关系性,然而我们忽略一个非常重要的信息,文本的顺序是含有非常的重要信息。举一个简单的例子,“钓鱼”两个词,如果我们单独去分析这两个词,而不是看作一个整体的话,那么我们得到的语意意思就是“钓”是一个动作词,“鱼”是一个名词,而当两个字放在一起的时候,我们知道其实我们想表述的“钓鱼”是我们要做的一个活动(event)。又比如英文“hot dog",我们都知道这个词组想表达的是我们吃的食物”热狗香肠包“,所以我们不希望单独去看hot和dog两个意思,如果是这样子我们可以看出意思相差非常的远,由此我们可以看出文本顺序的重要性。
而实际操作中,我们将这种把文本顺序保留下来的行为称之为建立N-grams模型,也就是我们将一个字符串分割成含有多个词的标识符(tokens)。当然,需要记住的一点是不论是上一节说的还是N-grams,他们都属于文本字符串Tokenization的一个过程。
1 import re 2 from nltk.util import ngrams 3 4 sentence = "I love deep learning as it can help me resolve some complicated problems in 2018." 5 6 # tokenize the sentence into tokens 7 pattern = re.compile(r"([-\s.,;!?])+") 8 tokens = pattern.split(sentence) 9 tokens = [x for x in tokens if x and x not in '- \t\n.,;!?'] 10 11 bigrams = list(ngrams(tokens, 2)) 12 print([" ".join(x) for x in bigrams])
上述代码的输出结果是:
['I love', 'love deep', 'deep learning', 'learning as', 'as it', 'it can', 'can help', 'help me', 'me resolve', 'resolve some', 'some complicated', 'complicated problems', '