nltk。是否可以将一个不同形式的单词算作一个单词(见,锯=见= 2)

时间:2019-07-12 09:28:17

标签: python nltk

我尝试分析文本并计算文本中的单词数量。但是我需要以不同形式的每个单词算作一个单词。 例如:

document = "I your hand. I see your hands."

请参阅= 2 脸= 2 我知道如何将单词带入字典形式。

document = "I saw your face I see your faces"
sentences = nltk.word_tokenize(document)
lemmatizer = WordNetLemmatizer()
for key, val in freq.items():
    print(lemmatizer.lemmatize(key.lower(), pos="v"))

我得到了这个 我看到了你的脸我看到了你的脸 我看见 您的 面对 看到 脸

看起来还可以。除了看到 单词可以是语音的不同部分。就像看见的是动词过去时和名词,单数。 所以我需要添加部分语音标签。

document = "I saw your face I see your faces"
sentences = nltk.sent_tokenize(document)
taggeDocument = nltk.pos_tag(nltk.word_tokenize(document))
for sent in sentences:
    print(nltk.pos_tag(nltk.word_tokenize(sent)))

现在我已标记文本。但是我不知道如何将单词带入字典形式。

我想要什么: 最后我想要这样的东西 ('I','PRP',2), ('see','VBP',2), 'face','NN',2), 等等。 预先感谢。

1 个答案:

答案 0 :(得分:1)

使用Lemmatization将单词转换成字典形式。

import nltk
from nltk.stem import WordNetLemmatizer
document = "I saw your face I see your faces"

##create list of pos
tokens = nltk.word_tokenize(document)
tokens_with_pos = nltk.pos_tag(tokens)
print "tokens and their pos tag"
print tokens_with_pos
pos_list = []
for word,pos in tokens_with_pos:
    pos_list.append(pos)

##create list of lemmas
wnl = WordNetLemmatizer()
lemmas = []
lemma_string = ""
for token in tokens:
    lemma = wnl.lemmatize(token)
    lemmas.append(lemma)
    lemma_string += " "+lemma

##zip list of pos and list of lemmas
lemma_pos = zip(lemmas,pos_list)
##turn list into a set to remove duplicates
lemma_pos_set = set(lemma_pos)

##create freq dist of lemmas
fdist = nltk.FreqDist()
for word in nltk.word_tokenize(lemma_string):
    #word.lower turns the words to lowercase
    fdist[word.lower()] += 1

#create list for lemma pos and frequency
lemma_pos_freq = []

#insert lemma, pos and frequency of lowercase lemma to list
for lemma,pos in lemma_pos_set:
    lemma_pos_freq.append((lemma,pos,fdist[lemma.lower()]))

print "lemmas with pos tags and lemma frequency"
print lemma_pos_freq

输出:

tokens and their pos tag
[('I', 'PRP'), ('saw', 'VBD'), ('your', 'PRP$'), ('face', 'NN'), ('I', 'PRP'), ('see', 'VBP'), ('your', 'PRP$'), ('faces', 'VBZ')]
lemmas with pos tags and lemma frequency
[(u'face', 'VBZ', 2), ('I', 'PRP', 2), ('face', 'NN', 2), ('your', 'PRP$', 2), ('see', 'VBP', 1), ('saw', 'VBD', 1)]

结果中有两个“ face”条目。这是因为两次出现的面部都用语音标签的不同部分进行了标签。 锯词不能通过词素化变成“看见”。合法化并非在所有情况下都有效。

zip函数使一个迭代器可以聚合来自每个可迭代对象的元素。参见https://docs.python.org/3.3/library/functions.html#zip

您也可以尝试阻止词干化而不是词条限制。参见http://www.nltk.org/howto/stem.html
词干示例:

from nltk.stem.snowball import SnowballStemmer
stemmer = SnowballStemmer("english", ignore_stopwords=True)
print(stemmer.stem("having")

可以在https://github.com/michaelhochleitner/https-stackoverflow.com-questions-57004127上找到代码。