我尝试分析文本并计算文本中的单词数量。但是我需要以不同形式的每个单词算作一个单词。 例如:
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), 等等。 预先感谢。
答案 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上找到代码。