我有一组文档,我希望将它们转换为这样的形式,它允许我计算这些文档中的单词的tfidf(这样每个文档都由tfidf-numbers的向量表示)。
我认为调用WordNetLemmatizer.lemmatize(word),然后调用PorterStemmer就足够了 - 但所有'have','has','have'等等都没有被变形器转换为'have' - 而且它也适用于其他词语。然后我读过,我应该提供一个lemmatizer的提示 - 代表一个单词类型的标签 - 无论是名词,动词,形容词等。
我的问题是 - 如何获得这些标签?我应该在这些文件上做什么来获得这个?
我正在使用python3.4,而且我一直是lemmatizing +词干单词。我从nltk尝试了WordNetLemmatizer和EnglishStemmer,还从stemming.porter2尝试了stem()。
答案 0 :(得分:1)
好的,我google了更多,我发现了如何获得这些标签。 首先必须做一些预处理,以确保文件将被标记化(在我的情况下,它是关于删除从pdf转换为txt后遗留的一些东西)。
然后这些文件必须被标记为句子,然后每个句子变成单词数组,并且可以用nltk标记器标记。通过这种词形还原可以完成,然后在其上添加词干。
from nltk.tokenize import sent_tokenize, word_tokenize
# use sent_tokenize to split text into sentences, and word_tokenize to
# to split sentences into words
from nltk.tag import pos_tag
# use this to generate array of tuples (word, tag)
# it can be then translated into wordnet tag as in
# [this response][1].
from nltk.stem.wordnet import WordNetLemmatizer
from stemming.porter2 import stem
# code from response mentioned above
def get_wordnet_pos(treebank_tag):
if treebank_tag.startswith('J'):
return wordnet.ADJ
elif treebank_tag.startswith('V'):
return wordnet.VERB
elif treebank_tag.startswith('N'):
return wordnet.NOUN
elif treebank_tag.startswith('R'):
return wordnet.ADV
else:
return ''
with open(myInput, 'r') as f:
data = f.read()
sentences = sent_tokenize(data)
ignoreTypes = ['TO', 'CD', '.', 'LS', ''] # my choice
lmtzr = WordNetLemmatizer()
for sent in sentences:
words = word_tokenize(sentence)
tags = pos_tag(words)
for (word, type) in tags:
if type in ignoreTypes:
continue
tag = get_wordnet_pos(type)
if tag == '':
continue
lema = lmtzr.lemmatize(word, tag)
stemW = stem(lema)
此时我得到词干stemW
然后我可以写入文件,并使用这些来计算每个文档的tfidf向量。