【问题标题】:how to create a function that tokenizes and stems the words如何创建一个对单词进行标记和词干化的函数
【发布时间】:2020-03-16 07:51:22
【问题描述】:

我的代码

def tokenize_and_stem(text):

    tokens = [sent for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(text)]

    filtered_tokens = [token for token in tokens if re.search('[a-zA-Z]', token)]

    stems = stemmer.stem(filtered_tokens)

words_stemmed = tokenize_and_stem("Today (May 19, 2016) is his only daughter's wedding.")
print(words_stemmed)

我收到了这个错误

AttributeError Traceback(最近一次调用最后一次) 在 13个返回茎 14 ---> 15 words_stemmed = tokenize_and_stem("今天(2016 年 5 月 19 日)是他唯一女儿的婚礼。") 16 打印(words_stemmed)

in tokenize_and_stem(text) 9
10 # 提取过滤后的令牌 ---> 11 个词干 = stemmer.stem(filtered_tokens) 12
13个返回茎

/usr/local/lib/python3.6/dist-packages/nltk/stem/snowball.py in stem(self, word) 1415 第1416章 -> 1417 字 = word.lower() 1418 第1419章 如果self.stopwords或len(word)中的单词

AttributeError: 'list' 对象没有属性 'lower'

【问题讨论】:

  • 看起来stemmer.stem 需要一个字符串,而不是字符串列表。你可以试试stems = list(map(stemmer.stem, filtered_tokens))。并将return stems 添加到您的函数中。

标签: python nltk token tokenize stemming


【解决方案1】:
import nltk
import string
from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
def tokenize_and_stem(text):
    tokens = nltk.tokenize.word_tokenize(text)
    # strip out punctuation and make lowercase
    tokens = [token.lower().strip(string.punctuation)
              for token in tokens if token.isalnum()]

    # now stem the tokens
    tokens = [stemmer.stem(token) for token in tokens]

    return tokens

tokenize_and_stem("Today (May 19, 2016) is his only daughter's wedding.")

输出:

['today', 'may', '19', '2016', 'is', 'hi', 'onli', 'daughter', 'wed']

【讨论】:

    【解决方案2】:

    你的代码

    def tokenize_and_stem(text):
    
    tokens = [sent for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(text)]
    
    filtered_tokens = [token for token in tokens if re.search('[a-zA-Z]', token)]
    
    stems = stemmer.stem(filtered_tokens)
    
    words_stemmed = tokenize_and_stem("Today (May 19, 2016) is his only daughter's 
    wedding.")
    print(words_stemmed)
    

    错误提示“”“word = word.lower()... if word in self.stopwords or len(word)

    错误不仅是因为 .lower() 还因为长度 如果您尝试在不更改第 5 行的 filtered_tokens 的情况下运行它, 不改变使用你的方式。 你不会得到任何错误,但输出会是这样的:

    [“今天(2016年5月19日)是他唯一女儿的婚礼。”、“今天(2016年5月19日)是他唯一女儿的婚礼。”、“今天(2016年5月19日)是他唯一的婚礼。”女儿的婚礼。”、“今天(2016 年 5 月 19 日)是他唯一女儿的婚礼。”、“今天(2016 年 5 月 19 日)是他唯一女儿的婚礼。”、“今天(2016 年 5 月 19 日)是他唯一女儿的婚礼。” ”、“今天(2016年5月19日)是他唯一女儿的婚礼。”、“今天(2016年5月19日)是他唯一女儿的婚礼。”、“今天(2016年5月19日)是他唯一女儿的婚礼。” 、“今天(2016年5月19日)是他唯一女儿的婚礼。”、“今天(2016年5月19日)是他唯一女儿的婚礼。”、“今天(2016年5月19日)是他唯一女儿的婚礼。”、“今天(2016 年 5 月 19 日)是他唯一女儿的婚礼。”、“今天(2016 年 5 月 19 日)是他唯一女儿的婚礼。”]

    这是您的固定代码。

    def tokenize_and_stem(text):
    
        tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)]
    
        filtered_tokens = [token for token in tokens if re.search('[a-zA-Z]', token)]
    
        stems = [stemmer.stem(t) for t in filtered_tokens if len(t) > 0]
    
        return stems
    
    words_stemmed = tokenize_and_stem("Today (May 19, 2016) is his only daughter's wedding.")
    print(words_stemmed)
    

    所以,我只更改了第 3 行和第 7 行

    【讨论】:

    • 谢谢您,您的代码不仅有效,而且还帮助了我的项目,因为您没有更改我的代码
    • alvas welp,harish 的回答有效,但在我的代码中出现了错误,但这有效,因为他没有更改我的任何代码
    • @alvas 那么,我的代码有什么问题?如果这篇文章的创建者验证了我的回答,那么讨论就毫无意义了。
    • bruh...我只是不输入代码。我修复它然后分享我的答案
    • 以及如何复制+粘贴我从未使用过 stackoverflow 我是新手,我花了 3 或 4 分钟解决了这个问题
    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多