当我们处理一个文本文档时, 我们遇到不同形式的单词. 考虑"play"一词. 这个词可以以"玩耍", "播放", "播放器", "比赛"等各种形式出现. 这些基本上都是具有相似含义的词组. 在文本分析期间, 提取这些单词的基本形式很有用. 这将有助于我们提取一些统计数据来分析整体文本. 词根的目标是将这些不同形式的词语减少为有共同基础形式的词. 这使用启发式过程来切断单词的末尾以提取基本形式. 让我们看看如何在Python中做到这一点.

怎么做...?

  • 创建文件并导入需要的包:
from nltk.stem.porter import PorterStemmer
from nltk.stem.lancaster import LancasterStemmer
from nltk.stem.snowball import SnowballStemmer
  • 我们定义一些需要处理的词:
words = [
    'table', 'probably', 'wolves',
    'playing', 'is',
    'dog', 'the', 'beaches',
    'grounded', 'dreamt', 'envision'
]
  • 我们将定义一个我们想要使用的词根的列表:
# Compare different stemmers
stemmers = ['PORTER', 'LANCASTER', 'SNOWBALL']
  • 初始化词根对象:
stemmer_porter = PorterStemmer()
stemmer_lancaster = LancasterStemmer()
stemmer_snowball = SnowballStemmer('english')
  • 为了以整齐的表格形式打印输出数据, 我们需要以正确的方式进行格式化
formatted_row = '{:>16}' * (len(stemmers) + 1)
print (formatted_row.format('WORD', *stemmers))
  • 我们重复一下单词列表,并使用三个词根
for word in words:
    stemmed_words = [
        stemmer_porter.stem(word),
        stemmer_lancaster.stem(word),
        stemmer_snowball.stem(word)
    ]
    print (formatted_row.format(word, *stemmed_words))
  • 输出结果如下:

工作原理...?

所有三个派生算法基本上都是为了达到同样的目的. 三种词根算法之间的区别基本上是它们操作的严格程度. 如果您观察输出, 您将看到Lancaster stemmer 比其他两个干线器更严格. Porter stemmer 是严格的, Lancaster stemmer是最严格的. 我们从Lancaster stemmer那里得到的词汇往往会变得混乱和容易混淆. 算法真的很快, 但会减少字数. 所以, 一个很好的经验法则是使用Snowball stemmer.

results matching ""

    No results matching ""