训练标记器并过滤句子中的停用词

machine learningpythonserver side programmingprogramming

简介

在 NLP 中,将文本标记为句子是一项非常重要的预处理任务。标记化是将文本语料库分解为单个句子的过程。在 NLTK 中,默认标记器可以很好地完成文本标记任务,但是当文本包含非标准的标点符号等时,它就会失败。在这种情况下,我们需要训练一个标记器。

在本文中,让我们探索标记器的训练,并了解过滤词或停用词的用法。

在 NLP 中标记一个句子

NLTK 中的默认标记器可用于下面给出的文本示例。

Ram - 上周日去哪儿了?

Mohan - 我去看了泰姬陵。

Ram - 泰姬陵在哪里

Mohan - 它位于阿格拉。它被认为是世界奇迹之一。

import nltk
nltk.download('punkt')
from nltk.tokenize import sent_tokenize

textual_data = """
Ram : Where have gone last Sunday?
Mohan : I went to see the Taj Mahal.
Ram: Where is the Taj Mahal located                  

Mohan: It is located in Agra.It is considered to be one of the wornders of the world.
"""
sentences = sent_tokenize(textual_data)
  
print(sentences[0])
print("\n",sentences)

输出

Ram : Where have gone last Sunday?

 ['\nRam : Where have gone last Sunday?', 'Mohan : I went to see the Taj Mahal.', 'Ram: Where is the Taj Mahal located                  \n\n\nMohan: It is located in Agra.It is considered to be one of the wonders of the world.']

最后一句的输出看起来不正确,因为标记器无法对文本进行标记,因为文本不遵循正常的段落结构。

在这种情况下,可以训练标记器。

data.txt 链接:https://drive.google.com/file/d/1bs2eBbSxTSeaAuDlpoDqGB89Ej9HAqPz/view?usp=sharing

训练标记器

我们将在此示例中使用 Punkt Sentence Tokenizer。

import nltk
nltk.download('webtext')

from nltk.tokenize import PunktSentenceTokenizer
from nltk.corpus import webtext
  
data = webtext.raw('/content/data.txt')
tokenizer_sentence = PunktSentenceTokenizer(data)
sentences = tokenizer_sentence.tokenize(data)
  
print(sentences[0])
print("\n",sentences)

输出

Ram : Where have gone last Sunday?

 ['Ram : Where have gone last Sunday?', 'Mohan : I went to see the Taj Mahal.', 'Ram: Where is the Taj Mahal located?', 'Mohan: It is located in Agra.It is considered to be one of the wonders of the world.']

过滤句子中的停用词

文本语料库中那些对特定句子没有意义的话被称为停用词。它们通常在预处理时从原文中删除,因为它们对 NLP 任务并不重要。NLTK 库是对应于不同语言的停用词的集合。

让我们通过一个代码示例来了解过滤停用词的过程。

例句:"每一代都会诞生一位新演员,受到众多粉丝的崇拜"

import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords as sw
from nltk.tokenize import word_tokenize
sentence = "A new actor is born every generation and is worshipped by many fans"
"
stopwords_en = set(sw.words('english'))
word_list = word_tokenize(sentence)
filtered_words = [w for w in word_list if w not in stopwords_en]
print ("Words present in the sentence initially : ",word_list)
print ("\nWords after stopword removal process : ",filtered_words)

输出

Words presents in the sentence initially :  ['A', 'new', 'actor', 'is', 'born', 'every', 'generation', 'and', 'is', 'worshipped', 'by', 'many', 'fans']

Words after stopword removal process :  ['A', 'new', 'actor', 'born', 'every', 'generation', 'worshipped', 'many', 'fans']

不同类型的标记化

TFIDF 标记化

TF-IDF 代表词频 - 逆文档频率。这是一种利用单词出现的频率来确定和衡量单词在特定文档中的重要性的算法。它有两个术语 TF(词频)和 IDF(逆文档频率)。

TF 表示单词在特定文档中出现的频率,如下所示

TF = d 中 t 的频率 / d 中的单词总数 = tf(t,d)

IDF 测量在语料库中的多少个文档 D 中,特定 t 术语出现,如下所示

IDF = 语料库中的文档总数 N / 具有术语 t 的文档数量 = idf(t,D)

TF-IDF 是 TF 和 IDF 术语的乘积

TF-IDF=tf(t,d) *idf(t,D)

使用 Scikit-learn 库的 TFIDF 矢量化器示例

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
corpus = ["Hello how are you","You have called me","How are you"]
data = vectorizer.fit_transform(corpus)
tokens = vectorizer.get_feature_names_out()
print(tokens)
print(data.shape)

输出

['are' 'called' 'have' 'hello' 'how' 'me' 'you']
(3, 7)

频率计数

此方法用于计算语料库中文档或文本中每个单词的频率。

例如,在给定的文本中

狐狸在丛林中行走。然后它看到一只老虎朝它走来。狐狸看到老虎后很害怕。"

可以发现单词频率为

coming: 1

it.The: 1

jungle: 1

seeing: 1

terrified: 1

then: 1

tiger: 2

towards: 1

walking: 1

import nltk
from nltk.corpus import webtext
from nltk.tokenize import word_tokenize
from nltk.probability import FreqDist
import nltk
nltk.download('punkt')
 
text_data = "The fox was walking in the jungle. It then saw a tiger coming towards it.The fox was terrified on seeing the tiger."
words = word_tokenize(text_data)
print(words)
 
word_freq = nltk.FreqDist(words)
 
words_filtered = dict([(i, j) for i, j in word_freq.items() if len(i) > 3])
 
for k in sorted(words_filtered):
   print("%s: %s" % (k, words_filtered[k]))

输出

['The', 'fox', 'was', 'walking', 'in', 'the', 'jungle', '.', 'It', 'then', 'saw', 'a', 'tiger', 'coming', 'towards', 'it.The', 'fox', 'was', 'terrified', 'on', 'seeing', 'the', 'tiger', '.']
coming: 1
it.The: 1
jungle: 1
seeing: 1
terrified: 1
then: 1
tiger: 2
towards: 1
walking: 1

基于规则的标记化

基于规则的标记化器使用一些预定义规则将文本分解为标记。这些规则可以是正则表达式过滤器或语法约束。

例如,可以使用规则按空格或逗号拆分文本。

此外,一些标记化器还处理具有特殊规则的推文,以拆分单词并保留表情符号等特殊字符。

以下是基于正则表达式规则的标记化器的代码示例。

from nltk.tokenize import regexp_tokenize
data_text = "Jack and Jill went up the hill."
print(regexp_tokenize(data_text, "[\w']+"))

输出

['Jack', 'and', 'Jill', 'went', 'up', 'the', 'hill']

停用词过滤器

停用词是常用词,在 NLP 和文本处理的上下文中不会给句子的含义添加任何特殊含义,并且通常被大多数标记器忽略。

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import nltk
nltk.download('stopwords')
text_data = "Hello how are you.You have called me. How are you"
data = word_tokenize(text_data)
filtered_words = [w for w in data if w not in stopwords.words('english')]
print(filtered_words)

输出

['Hello', '.', 'You', 'called', '.', 'How']

结论

句子标记和停用词删除是两个非常常见且重要的 NLP 文本预处理步骤。对于简单的语料库结构,可以使用默认的句子标记,但是,对于不在通常段落结构中的文本,甚至可以训练标记器。停用词对句子的含义没有贡献,因此在文本预处理期间会被过滤掉。


相关文章