【问题标题】:CSV file with label带标签的 CSV 文件
【发布时间】:2018-03-15 02:18:31
【问题描述】:

正如这里Python Tf idf algorithm 所建议的那样,我使用此代码来获取一组文档中单词的频率。

import pandas as pd
import csv
import os
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk import word_tokenize
from nltk.stem.porter import PorterStemmer
import codecs

def tokenize(text):
    tokens = word_tokenize(text)
    stems = []
    for item in tokens: stems.append(PorterStemmer().stem(item))
    return stems

with codecs.open("book1.txt",'r','utf-8') as i1,\
        codecs.open("book2.txt",'r','utf-8') as i2,\
        codecs.open("book3.txt",'r','utf-8') as i3:
    # your corpus
    t1=i1.read().replace('\n',' ')
    t2=i2.read().replace('\n',' ')
    t3=i3.read().replace('\n',' ')

    text = [t1,t2,t3]
    # word tokenize and stem
    text = [" ".join(tokenize(txt.lower())) for txt in text]
    vectorizer = TfidfVectorizer()
    matrix = vectorizer.fit_transform(text).todense()
    # transform the matrix to a pandas df
    matrix = pd.DataFrame(matrix, columns=vectorizer.get_feature_names())
    # sum over each document (axis=0)
    top_words = matrix.sum(axis=0).sort_values(ascending=False)

    top_words.to_csv('dict.csv', index=True, float_format="%f",encoding="utf-8")

在最后一行,我创建了一个 csv 文件,其中列出了所有单词及其频率。有没有办法给它们贴上标签,看看一个词是只属于第三个文件,还是属于所有? 我的目标是从 csv 文件中删除所有仅出现在第三个文档中的单词 (book3)

【问题讨论】:

  • 您在该答案中缺少部分代码,特别是 tokenize() 函数。
  • @Gabriel 对,对不起,我添加了它
  • 您仍然缺少 word_tokenize()PorterStemmer() 导入。请确保您的代码运行,如果它没有清楚地解释发生了什么以及您希望它做什么。
  • @Gabriel 我错过了导入,抱歉
  • (现在您正在添加不需要的导入:csvos)如果您的目标是删除第 3 本书中出现的所有单词,为什么还要阅读它呢?你不能从一开始就简单地忽略它吗?如果是这样,为什么不呢?

标签: python csv export-to-csv tf-idf sklearn-pandas


【解决方案1】:

您可以使用isin() 属性从整个语料库中的top_ words 中过滤掉您在第三本书中的top_words

(对于下面的例子,我从http://www.gutenberg.org/随机下载了三本书)

import codecs
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
# import nltk
# nltk.download('punkt')
from nltk import word_tokenize
from nltk.stem.porter import PorterStemmer

def tokenize(text):
    tokens = word_tokenize(text)
    stems = []
    for item in tokens: stems.append(PorterStemmer().stem(item))
    return stems

with codecs.open("56732-0.txt",'r','utf-8') as i1,\
        codecs.open("56734-0.txt",'r','utf-8') as i2,\
        codecs.open("56736-0.txt",'r','utf-8') as i3:
    # your corpus
    t1=i1.read().replace('\n',' ')
    t2=i2.read().replace('\n',' ')
    t3=i3.read().replace('\n',' ')

text = [t1,t2,t3]
# word tokenize and stem
text = [" ".join(tokenize(txt.lower())) for txt in text]
vectorizer = TfidfVectorizer()
matrix = vectorizer.fit_transform(text).todense()
# transform the matrix to a pandas df
matrix = pd.DataFrame(matrix, columns=vectorizer.get_feature_names())
# sum over each document (axis=0)
top_words = matrix.sum(axis=0).sort_values(ascending=False)

# top_words for the 3rd book alone
text = [" ".join(tokenize(t3.lower()))]
matrix = vectorizer.fit_transform(text).todense()
matrix = pd.DataFrame(matrix, columns=vectorizer.get_feature_names())
top_words3 = matrix.sum(axis=0).sort_values(ascending=False)

# Mask out words in t3
mask = ~top_words.index.isin(top_words3.index)
# Filter those words from top_words
top_words = top_words[mask]

top_words.to_csv('dict.csv', index=True, float_format="%f",encoding="utf-8")

【讨论】:

  • 谢谢。无论如何,我分析 3 个文档但我只考虑其中 2 个的单词是否正确(正如我在另一条评论中所说)?
  • 乍一看似乎很合理。
  • 文本中没有出现的单词怎么可能出现在csv文件中?
  • The line text = [" ".join(tokenize(txt.lower())) for txt in text] 以错误的方式截断单词:像 Hermione 这样的单词,变成了完全不同的 hermion错了
  • 这是您最初问题的一部分,我没有想出那条线。我会检查tokenize() 电话,看看发生了什么。也许这是连字符?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多