【问题标题】:Error when using Lemmatization and Tf- Idf calculation on Twitter data frame in Python在 Python 中的 Twitter 数据帧上使用 Lemmatization 和 Tf- Idf 计算时出错
【发布时间】:2020-07-27 06:46:38
【问题描述】:

我有一个推文数据框,我正在尝试在词形化的“推文”列上计算 Tf-Idf。我对词形还原的结果有疑问,并且在尝试计算 Tf-Idf 时遇到错误。

下面是我的代码:

w_tokenizer = nltk.tokenize.WhitespaceTokenizer()
lemmatizer=WordNetLemmatizer()

def lemmatize_text(tweet):
    return [lemmatizer.lemmatize(w) for w in w_tokenizer.tokenize(tweet)]

df['tweet_lemmatized'] = df['tweet'].apply(lemmatize_text)

这是具有新列“tweet_lemmatized”的数据框示例:

  target       tweet_lemmatized
    0        [believe, department, year, released, hoping]
    1        [huge, expected, tomorrow, night, beginning]

效果不佳,因为栏目中有“希望”、“开始”之类的词。

我的第一个问题——如何改进词形还原?

现在我想计算该列的 Tf- Idf 并在我的数据框中生成带有顶部单词的新列。

这是我的 Tf-Idf 代码: 我想将最上面的词添加到我的原始数据框“df”中。

from sklearn.feature_extraction.text import TfidfVectorizer, ENGLISH_STOP_WORDS

tfidf= TfidfVectorizer(ngram_range=(1,2), max_features=100,  
       stop_words=ENGLISH_STOP_WORDS).fit(df.tweet_lemmatized)

tfidf_tweet = tfidf.transform(df.tweet_lemmatized)

result=pd.DataFrame(tfidf_tweet.toarray(), columns=tfidf.get_feature_names())

这是我得到的错误:

AttributeError: 'list' object has no attribute 'lower'

【问题讨论】:

    标签: python tf-idf lemmatization


    【解决方案1】:

    TfidfVectorizer.fit 接受字符串输入而不是列表(您的 df.tweet_lemmatized 数据应该包含字符串而不是列表)。 为了更好地进行词形还原,您可以使用nltk.pos_tag 获取词性,然后根据其标签对单词进行词形还原,例如:

    lemmatizer.lemmatize(word, 'v')
    

    考虑到它是一个动词,这样它会将word 进行词形还原。

    【讨论】:

    • 谢谢!您关于词形还原的建议奏效了。我应该如何处理 df.tweet_lemmatized 列?你能解释更多吗?
    • TfidfVectorizer.fit 本身从文本(字符串)中提取单词,因此您需要将字符串传递给它;您可以使用df.tweet_lemmatized = df.tweet_lemmatized.str.join(' ') 。 @莉莉
    • 好的。现在它起作用了。我正在尝试将具有 tf-idf 计算的列(不只包含零的列)添加到我的原始数据框“df”中。我该怎么做?
    • 您可以从transform 的输出中获得的词袋中创建一个数据框,然后将其与您的数据框连接起来(不要忘记使用list(bagOfWords.toarray()) 来表示pd.DataFrame的输入)。您还可以通过为TfidfVectorizer 的构造函数设置max_features 来仅从transform 中获取最上面的单词。 @莉莉
    • 连接效果不佳。它将 Null 添加到 df。这是我所做的: Tfidf_tweet = Tfidf.transform(df.tweet_lemmatized);结果=pd.DataFrame(Tfidf_tweet.toarray(),列=Tfidf.get_feature_names()); df_concat = pd.concat([df, result], axis=1) 你知道为什么吗?
    【解决方案2】:

    您可以使用PorterStemmer() 或修改WordNetLemmatizer()

    stemmer = nltk.PorterStemmer()
    stemmer.step('hoping')
    

    或者:

    lemmatizer = WordNetLemmatizer()
    lemmatizer.lemmatize("running", 'v')
    

    【讨论】:

      猜你喜欢
      • 2020-02-14
      • 2015-04-17
      • 1970-01-01
      • 2020-04-13
      • 2015-02-14
      • 2021-12-15
      • 2012-04-23
      • 2017-11-14
      • 2018-03-16
      相关资源
      最近更新 更多