赞
踩
词干化(Stemming)和词形还原(Lemmatization)都是文本预处理的技术,用于将单词转化为它们的基本形式,以减少词汇的多样性,提高文本处理和分析的效果。
词干化(Stemming)和词形还原(Lemmatization)有不同的原理和适用场景,具体说明如下所示。
1. 词干化(Stemming)
2. 词形还原(Lemmatization)
总之,词干化和词形还原都有其用武之地,但根据任务需求和精确性要求的不同,选择哪种方法会有所不同。词形还原通常更复杂且准确,但需要更多的计算资源和语言资源(如词典)。词干化更加简单和快速,但可能不如词形还原准确。
词干化是一种将单词转化为它们的基本形式(词干)的文本处理技术,在下面的内容中,将详细讲解常用的词干化算法技术。
1. Porter Stemming算法
Porter词干化算法是最早和最常用的词干化算法之一,它是一种基于规则的算法,通过一系列规则和模式匹配来截断单词的后缀。这个算法在许多自然语言处理任务中广泛使用,尤其是信息检索领域。例如下面是一个使用Natural Language Toolkit (NLTK)库来执行Porter Stemming算法的例子,这个例子将一些单词进行词干化,以演示将单词还原到它们的基本形式的过程。
实例2-3:将单词还原到它们的基本形式(源码路径:daima/2/gan.py)
实例文件gan.py的具体实现代码如下所示。
- import nltk
- from nltk.stem import PorterStemmer
-
- # 初始化Porter词干化器
- stemmer = PorterStemmer()
-
- # 待词干化的单词列表
- words = ["running", "flies", "happily", "stemmer", "jumps", "easily"]
-
- # 对每个单词执行词干化
- stemmed_words = [stemmer.stem(word) for word in words]
-
- # 显示原始单词和词干化后的结果
- for original, stemmed in zip(words, stemmed_words):
- print(f"原始单词: {original} -> 词干化后: {stemmed}")
在上述代码中,使用Porter Stemming算法对单词列表进行词干化,然后将原始单词和词干化后的结果进行对比显示。你可以看到算法如何将单词“running”还原为“run”等。执行后会输出:
- 原始单词: running -> 词干化后: run
- 原始单词: flies -> 词干化后: fli
- 原始单词: happily -> 词干化后: happili
- 原始单词: stemmer -> 词干化后: stemmer
- 原始单词: jumps -> 词干化后: jump
- 原始单词: easily -> 词干化后: easili
2. Snowball Stemming算法(Porter2)
Snowball是Porter词干化算法的改进版本,也被称为Porter2。它修复了Porter算法中的一些问题,提供了更准确的词干化,同时支持多种语言。例如下面是一个使用NLTK库来执行Snowball Stemming算法的例子,功能是将一些单词进行词干化,以演示将单词还原到它们的基本形式的过程。
实例2-4:使用Porter2算法将单词还原到它们的基本形式(源码路径:daima/2/gan02.py)
实例文件gan02.py的具体实现代码如下所示。
- import nltk
- from nltk.stem import SnowballStemmer
-
- # 初始化Snowball词干化器
- stemmer = SnowballStemmer("english")
-
- # 待词干化的单词列表
- words = ["jumping", "flies", "happily", "stemming", "jumps", "easily"]
-
- # 对每个单词执行词干化
- stemmed_words = [stemmer.stem(word) for word in words]
-
- # 显示原始单词和词干化后的结果
- for original, stemmed in zip(words, stemmed_words):
- print(f"原始单词: {original} -> 词干化后: {stemmed}")
在上述代码中,Snowball Stemming算法的执行结果会将单词"jumping"还原为"jump",而Porter Stemming算法的结果可能为"jump"。这是两种不同的词干化方法在特定情况下的区别。这个示例突出了Snowball Stemming算法的优势,它更准确地考虑了一些特定的英语语法规则,使得在不同单词上可能产生不同的词干。执行后会输出:
- 原始单词: jumping -> 词干化后: jump
- 原始单词: flies -> 词干化后: fli
- 原始单词: happily -> 词干化后: happili
- 原始单词: stemming -> 词干化后: stem
- 原始单词: jumps -> 词干化后: jump
- 原始单词: easily -> 词干化后: easili
3. Lancaster Stemming算法
Lancaster词干化算法是另一种基于规则的词干化算法,它较Porter算法更加激进,更倾向于将单词截断至更短的形式。它适用于某些任务,但可能会导致一些不常见的单词被切割过度。例如下面是一个使用NLTK库执行Lancaster Stemming算法的例子。
实例2-5:使用Lancaster Stemming算法(源码路径:daima/2/gan03.py)
实例文件gan03.py的具体实现代码如下所示。
- import nltk
- from nltk.stem import LancasterStemmer
-
- # 初始化Lancaster词干化器
- stemmer = LancasterStemmer()
-
- # 待词干化的单词列表
- words = ["running", "flies", "happily", "stemmer", "jumps", "easily"]
-
- # 对每个单词执行词干化
- stemmed_words = [stemmer.stem(word) for word in words]
-
- # 显示原始单词和词干化后的结果
- for original, stemmed in zip(words, stemmed_words):
- print(f"原始单词: {original} -> 词干化后: {stemmed}")
在上述代码中,使用Lancaster Stemming算法对单词列表进行词干化,然后将原始单词和词干化后的结果进行对比显示。你可以看到,Lancaster Stemming算法的结果可能更短和更激进,例如将单词"running"词干化为"run",而不是像Porter Stemming或Snowball Stemming那样产生更多保留的词干。这个示例突出了Lancaster Stemming算法的激进特性,可能适合某些特定的文本处理需求。执行后会输出:
- 原始单词: running -> 词干化后: run
- 原始单词: flies -> 词干化后: fli
- 原始单词: happily -> 词干化后: happy
- 原始单词: stemmer -> 词干化后: stem
- 原始单词: jumps -> 词干化后: jump
- 原始单词: easily -> 词干化后: easy
4. Lovins Stemming算法
Lovins词干化算法是另一种基于规则的算法,与Porter和Lancaster相比,它更简单和保守。它保留了更多的单词形式,不太容易将单词切割过度。请看下面的例子,功能是使用自定义的Lovins Stemming算法来词干化单词。
实例2-6:使用Lovins Stemming算法词干化单词(源码路径:daima/2/gan04.py)
实例文件gan04.py的具体实现代码如下所示。
- # 定义Lovins Stemming规则
- def apply_lovins_rules(word):
- # Lovins Stemming的简化规则示例
- if word.endswith("ing"):
- return word[:-3] # 移除-ing后缀
- elif word.endswith("ly"):
- return word[:-2] # 移除-ly后缀
- else:
- return word # 保留原始单词
-
- # 待词干化的单词列表
- words = ["running", "flies", "happily", "stemmer", "jumps", "easily"]
-
- # 对每个单词执行词干化
- stemmed_words = [apply_lovins_rules(word) for word in words]
-
- # 显示原始单词和词干化后的结果
- for original, stemmed in zip(words, stemmed_words):
- print(f"原始单词: {original} -> 词干化后: {stemmed}")
上述代码演示了一个简化的Lovins Stemming规则,将以"ing"和"ly"结尾的单词进行处理。请注意,这只是一个示例,实际的Lovins Stemming算法包含更多复杂的规则。执行后会输出:
- 原始单词: running -> 词干化后: runn
- 原始单词: flies -> 词干化后: flies
- 原始单词: happily -> 词干化后: happi
- 原始单词: stemmer -> 词干化后: stemmer
- 原始单词: jumps -> 词干化后: jumps
- 原始单词: easily -> 词干化后: easi
5. Regex-Based Stemming算法
正则表达式也可以用于词干化,根据需要定义一些规则和模式,然后应用正则表达式来匹配和替换单词的后缀。这种方法可以针对特定任务定制,但通常不如基于规则的算法通用。请看下面的例子,功能是使用正则表达式来执行Regex-Based Stemming,对单词应用自定义的词干化规则。
实例2-7:使用正则表达式来执行Regex-Based Stemming(源码路径:daima/2/gan05.py)
实例文件gan05.py的具体实现代码如下所示。
- import re
-
- # 自定义词干化规则
- def custom_stemmer(word):
- # 使用正则表达式匹配规则
- if re.search(r"ing$", word):
- return re.sub(r"ing$", "", word) # 移除-ing后缀
- elif re.search(r"ly$", word):
- return re.sub(r"ly$", "", word) # 移除-ly后缀
- else:
- return word # 保留原始单词
-
- # 待词干化的单词列表
- words = ["running", "flies", "happily", "stemmer", "jumps", "easily"]
-
- # 对每个单词执行词干化
- stemmed_words = [custom_stemmer(word) for word in words]
-
- # 显示原始单词和词干化后的结果
- for original, stemmed in zip(words, stemmed_words):
- print(f"原始单词: {original} -> 词干化后: {stemmed}")
在上述代码中,使用自定义的Regex-Based Stemming规则,使用正则表达式来匹配特定的后缀,然后应用规则来移除这些后缀。在示例中,我们定义了规则以移除以"ing"和"ly"结尾的后缀,但是可以根据需要扩展和定制规则,以适应特定的文本处理需求。执行后会输出:
- 原始单词: running -> 词干化后: runn
- 原始单词: flies -> 词干化后: flies
- 原始单词: happily -> 词干化后: happi
- 原始单词: stemmer -> 词干化后: stemmer
- 原始单词: jumps -> 词干化后: jumps
- 原始单词: easily -> 词干化后: easi
词形还原(Lemmatization)是自然语言处理中的文本处理技术,旨在将单词还原为它们的基本形式,也被称为词元(lemma)或词根(root)。与词干化(Stemming)不同,词形还原考虑了单词的语法和语境,以确保还原后的单词是合法的,有词法准确性。在下面的内容中,将详细讲解常用的词形还原算法技术。
1. WordNet Lemmatizer
WordNet是一个英语词汇数据库,WordNet Lemmatizer使用WordNet中的词形还原数据来将单词还原为它们的基本形式。在NLTK库中提供了WordNet Lemmatizer。例如下面是一个使用NLTK库中的WordNet Lemmatizer来执行词形还原的示例。在此示例中,我们将一些单词进行词形还原,以演示如何将单词还原为它们的基本形式。
实例2-8:使用WordNet Lemmatizer执行词形还原(源码路径:daima/2/huan.py)
实例文件huan.py的具体实现代码如下所示。
- import nltk
- from nltk.stem import WordNetLemmatizer
-
- # 初始化WordNet Lemmatizer
- lemmatizer = WordNetLemmatizer()
-
- # 待词形还原的单词列表
- words = ["running", "flies", "happily", "stemmer", "jumps", "easily"]
-
- # 对每个单词执行词形还原
- lemmatized_words = [lemmatizer.lemmatize(word, pos='v') for word in words]
-
- # 显示原始单词和词形还原后的结果
- for original, lemmatized in zip(words, lemmatized_words):
- print(f"原始单词: {original} -> 词形还原后: {lemmatized}")
在上述代码中,使用了WordNet Lemmatizer来将单词还原为它们的基本形式。参数pos用于指定单词的词性,这里我们将其设置为'verb'(动词),因为示例中的大多数单词都是动词。如果你的文本包含不同词性的单词,可以根据需要进一步调整参数pos。执行后会输出:
- 原始单词: running -> 词形还原后: run
- 原始单词: flies -> 词形还原后: fly
- 原始单词: happily -> 词形还原后: happily
- 原始单词: stemmer -> 词形还原后: stemmer
- 原始单词: jumps -> 词形还原后: jump
- 原始单词: easily -> 词形还原后: easily
2. spaCy
spaCy是一个自然语言处理库,它提供了强大的词形还原功能,包括多语言支持。spaCy的词形还原能力非常出色。请看下面的例子,演示了使用spaCy词形还原单词的过程。
实例2-9:使用spaCy词形还原单词(源码路径:daima/2/huan02.py)
(1)要使用spaCy库来执行词形还原,首先确保你已经安装了spaCy并下载了相应的模型。可以使用以下命令来安装spaCy和下载英语模型:
- pip install spacy
- python -m spacy download en_core_web_sm
(2)然后可以使用spaCy的词形还原功能,实例文件huan02.py的具体实现代码如下所示。
- import spacy
-
- # 加载spaCy英语模型
- nlp = spacy.load("en_core_web_sm")
-
- # 待词形还原的文本
- text = "I was running and he jumps easily."
-
- # 使用spaCy进行词形还原
- doc = nlp(text)
-
- # 提取词形还原后的结果
- lemmatized_text = " ".join([token.lemma_ for token in doc])
-
- # 显示原始文本和词形还原后的结果
- print(f"原始文本: {text}")
- print(f"词形还原后: {lemmatized_text}")
在上述代码中,首先加载了spaCy的英语模型,然后将文本传递给spaCy的NLP处理管道。最后,我们提取词形还原后的结果,并显示原始文本和词形还原后的结果。执行后会输出:
- 原始文本: I was running and he jumps easily.
- 词形还原后: -PRON- be run and -PRON- jump easily .
3. StanfordNLP
StanfordNLP是斯坦福大学开发的自然语言处理工具包,它提供了高质量的词形还原功能。请看下面的例子,功能是使用StanfordNLP进行词形还原。
实例2-10:使用StanfordNLP进行词形还原(源码路径:daima/2/huan03.py)
实例文件huan03.py的具体实现代码如下所示。
- import stanfordnlp
-
- # 初始化StanfordNLP
- stanfordnlp.download('en') # 下载英语模型,如果尚未下载
- nlp = stanfordnlp.Pipeline() # 初始化NLP处理管道
-
- # 待词形还原的文本
- text = "I was running and he jumps easily."
-
- # 使用StanfordNLP进行词形还原
- doc = nlp(text)
-
- # 提取词形还原后的结果
- lemmatized_text = " ".join([word.lemma for sent in doc.sentences for word in sent.words])
-
- # 显示原始文本和词形还原后的结果
- print(f"原始文本: {text}")
- print(f"词形还原后: {lemmatized_text}")
在上述代码中,首先,下载了英语模型,然后初始化了StanfordNLP的处理管道。接着,我们将文本传递给处理管道,提取词形还原后的结果,并最后显示原始文本和词形还原后的文本。执行后会输出:
- 原始文本: I was running and he jumps easily.
- 词形还原后: I be run and he jump easily .
4. TextBlob
TextBlob是一个简单的自然语言处理库,它包含了词形还原功能,适用于简单的文本处理任务。例如下面是一个使用TextBlob库来实现词形还原的例子。
实例2-11:使用TextBlob库实现词形还原(源码路径:daima/2/huan04.py)
(1)下载NLTK的WordNet数据,因为TextBlob的词形还原功能依赖于WordNet:
python -m textblob.download_corpora
(2)实例文件huan04.py的具体实现代码如下所示。
- from textblob import Word
-
- # 待词形还原的单词列表
- words = ["running", "flies", "happily", "stemmer", "jumps", "easily"]
-
- # 对每个单词执行词形还原
- lemmatized_words = [Word(word).lemmatize() for word in words]
-
- # 显示原始单词和词形还原后的结果
- for original, lemmatized in zip(words, lemmatized_words):
- print(f"原始单词: {original} -> 词形还原后: {lemmatized}")
在上述代码中,使用TextBlob的Word类来执行词形还原。对于提供的单词列表,TextBlob会自动将它们还原为它们的基本形式。执行后会输出:
- 原始单词: running -> 词形还原后: running
- 原始单词: flies -> 词形还原后: fly
- 原始单词: happily -> 词形还原后: happily
- 原始单词: stemmer -> 词形还原后: stemmer
- 原始单词: jumps -> 词形还原后: jump
- 原始单词: easily -> 词形还原后: easily
5. 自定义规则
我们还可以创建自定义的词形还原规则,使用正则表达式或特定的语法规则来还原单词,这一方法对于特定任务非常有用。假设你正在处理一个文本中的动物名称,想将这些动物名称还原为它们的单数形式。例如,将"cats"还原为"cat","dogs"还原为"dog"等。下面的例子实现了这一功能。
实例2-12:使用特定规则还原单词(源码路径:daima/2/huan05.py)
实例文件huan05.py的具体实现代码如下所示。
- # 自定义词形还原规则,将动物名称还原为单数形式
- def custom_lemmatize(word):
- # 自定义规则示例:将复数名词还原为单数形式
- if word.lower().endswith("s"):
- return word[:-1]
- return word
-
- # 待词形还原的单词列表
- animal_names = ["cats", "dogs", "elephants", "puppies", "kangaroos"]
-
- # 对每个动物名称执行词形还原
- lemmatized_animals = [custom_lemmatize(word) for word in animal_names]
-
- # 显示原始动物名称和词形还原后的结果
- for original, lemmatized in zip(animal_names, lemmatized_animals):
- print(f"原始动物名称: {original} -> 词形还原后: {lemmatized}")
上述代码演示了使用自定义规则将动物名称还原为它们的单数形式的过程,可以根据具体需求自定义规则,这在某些特定领域或任务中非常有用。执行后会输出:
- 原始动物名称: cats -> 词形还原后: cat
- 原始动物名称: dogs -> 词形还原后: dog
- 原始动物名称: elephants -> 词形还原后: elephant
- 原始动物名称: puppies -> 词形还原后: puppie
- 原始动物名称: kangaroos -> 词形还原后: kangaroo
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。