【问题标题】:Bag of Words with json array带有 json 数组的词袋
【发布时间】:2018-07-26 03:17:39
【问题描述】:

我正在尝试按照本教程制作一个自定义的词袋。

from sklearn.feature_extraction.text import CountVectorizer

corpus = [
'All my cats in a row',
    'When my cat sits down, she looks like a Furby toy!',
    'The cat from outer space',
    'Sunshine loves to sit like this for some reason.'
]
vectorizer = CountVectorizer()
print( vectorizer.fit_transform(corpus).todense() )
print( vectorizer.vocabulary_ )

这个脚本打印出:

[[1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1]
 [0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0]
 [0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0]]
{u'all': 0, u'sunshine': 20, u'some': 18, u'down': 3, u'reason': 13, u'looks': 9, u'in': 7, u'outer': 12, u'sits': 17, u'row': 14, u'toy': 24, u'from': 5, u'like': 8, u'for': 4, u'space': 19, u'this': 22, u'sit': 16, u'when': 25, u'cat': 1, u'to': 23, u'cats': 2, u'she': 15, u'loves': 10, u'furby': 6, u'the': 21, u'my': 11}

所以这是我的问题:我有一个具有这种数据结构的 json 文件:

[
    {
        "id": "1",
        "class": "positive",
        "tags": [
            "tag1",
            "tag2"
        ]
    },
    {
        "id": "2",
        "class": "negative",
        "tags": [
            "tag1",
            "tag3"
        ]
    }
]

所以我试图对标签数组进行矢量化,但没有成功。

我尝试过这样的事情:

data = json.load(open('data.json'));
print( vectorizer.fit_transform(data).todense() )

还有:

for element in data:
print( vectorizer.fit_transform(element).todense() ) 
#or 
print( vectorizer.fit_transform(element['tags']).todense() ) 

没有人工作。有任何想法吗?

【问题讨论】:

    标签: python classification document-classification


    【解决方案1】:

    1。使用pandas将json文件读入DataFrame

    import pandas as pd
    from sklearn.feature_extraction.text import CountVectorizer
    
    df = pd.read_json('data.json', orient='values')
    print(df)
    

    这就是您的DataFrame 的样子:

    Out[]:       
          class  id          tags
    0  positive   1  [tag1, tag2]
    1  negative   2  [tag1, tag3]
    

    2。将标签列从list 转换为str

    df['tags'] = df['tags'].apply(lambda x: ' '.join(x))
    print(df)
    

    这将导致将tags 转换为空格分隔的字符串:

    Out[]:       
    class  id       tags
    0  positive   1  tag1 tag2
    1  negative   2  tag1 tag3
    

    3。将tags 列/pandas Series 插入CountVectorizer

    vectorizer = CountVectorizer()
    print(vectorizer.fit_transform(df['tags']).todense())
    print(vectorizer.vocabulary_)
    

    这将产生你想要的输出:

    Out[]:       
    [[1 1 0]
     [1 0 1]]
    {'tag1': 0, 'tag2': 1, 'tag3': 2}
    

    【讨论】:

    • 我无法要求更好、更详细的答案。非常感谢。
    • 没问题!乐于助人
    • 其他小问题。如果我想将类作为向量的第一个位置?更具体地说,在我的示例中,班级只有两个(正面和负面),但实际上我有两个以上的班级。再次感谢您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2015-09-08
    • 2012-06-27
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多