【问题标题】:nltk. Is it possible to count one word in different form as one word(see, saw = see = 2)nltk.是否可以将不同形式的一个单词算作一个单词(see, saw = see = 2)
【发布时间】:2019-07-12 09:28:17
【问题描述】:

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

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"))

我有这个 我看到了你的脸 我看到了你的脸 我看见 您的 脸 看 脸

看起来不错。除了锯 一个词可以是不同的词性。 like saw 是动词的过去式和名词,单数。 所以我需要添加词性标签。

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)))

现在我已经标记了文本。但我不知道如何将单词转换为字典形式。

我想要的: 最后我想要这样的东西 ('我','PRP',2), ('见', 'VBP',2), '脸', 'NN', 2), 等等。 提前致谢。

【问题讨论】:

  • 您想要的是将同一动词的不同语法形式简化为单个规范表示。这就是所谓的词干。在您的 NLTK 文档中查找 stemming
  • 感谢您的提示。是的,我想标记词性,而不是将每个单词简化为规范形式,然后计算它在文本中出现的次数。事实上,我想分析一段文字并找到我不知道的单词。

标签: python nltk


【解决方案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 获得。

【讨论】:

  • 谢谢朋友!这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2013-07-15
  • 2018-01-13
相关资源
最近更新 更多