我正在尝试编写代码,该代码传递经过标记化的文本,并过滤掉停用词,然后阻止并标记它。但是,我不确定应该以什么顺序进行茎和标记。这是我目前所拥有的:
#### Stemming
ps = PorterStemmer() # PorterStemmer imported from nltk.stem
stemText = []
for word in swFiltText: # Tagged text w/o stop words
stemText.append(ps.stem(word))
#### POS Tagging
def tagging():
tagTot = []
try:
for i in stemText:
words = nltk.word_tokenize(i) # I need to tokenize again (idk why?)
tagged = nltk.pos_tag(words)
tagTot = tagTot + tagged # Combine tagged words into list
except Exception as e:
print(str(e))
return tagTot
tagText = tagging()
乍看之下,这很好。但是,由于我先干了,所以pos_tag
通常会误贴单词。例如,当原始单词实际上是名词“ house”时,它将“ hous”标记为形容词。但是,当我尝试在标记后进行词干处理时,它给我一个关于pos_tag
如何无法处理“元组”的错误-我猜想这与词干将词列表格式化为[('come', 'VB'), ('hous', 'JJ')
的方式有关]等
我应该使用其他词干/匕首吗?还是我的代码中的错误?
提前感谢!
我建议对词干使用词形除法,从词尾将词干切掉,直到到达词根/词干为止。词法化还会查看周围的文本,以确定给定单词的词性。
您应该标记文本之前,然后对其应用词干或词义化。
删除单词的结尾消除了关于单词可以成为词性标签的关键线索。
您将hous用作形容词的原因是,任何标记器都希望未处理的标记,而英语中以-ous结尾的单词通常是形容词(nefarious,serious )。如果先标记它,它可以被识别(甚至没有上下文)为名词或动词。然后,标记者可以使用上下文(以the?->名词开头)消除歧义,这是最有可能的。
一个好的词修饰器可以考虑词性,例如住房可以是名词(词性:住房)或动词(词性:房子)。借助p-o-s信息,切词机可以在那里做出正确的选择。
您是否使用词干或词根限制取决于您的应用程序。对于许多目的,它们将是等效的。根据我的经验,主要区别在于: