如何在MongoDB集合中存储Stanza Span?

vcirk6k6  于 2023-03-01  发布在  Go
关注(0)|答案(1)|浏览(132)

我正在尝试添加字典列表(名称为stanzanerlist),如下所示:

stanzanerlist = [{
  "text": "Harry Potter",
  "type": "PER",
  "start_char": 141,
  "end_char": 153
}, {
  "text": "Hogwarts",
  "type": "LOC",
  "start_char": 405,
  "end_char": 413
}, {
  "text": "JK Rowling",
  "type": "PER",
  "start_char": 505,
  "end_char": 515
}]

作为集合中MongoDB文档的字段。
我将按如下所示插入整个文档,并将stanzanerlist作为mongodocument中的最后一项:

mongodocument = {
        "_id": urlid,
        "source": sourcename,
        "stanzadoc": stanzadoc.to_serialized(),
        "stanzaver": stanzaver,
        # "timestamp": datetime.now(tzinfo),
        "timestamp": datetime.now(
            tz=pytz.timezone(cfgdata["timezone"]["name"])
        ),
        "stanzanerlist": stanzanerlist,
    }
try:
        mdbrc = mdbcoll.insert_one(
            mongodocument
        )  # insert fails if URL/_ID already exists
        return mdbrc
except pymongo.errors.DuplicateKeyError:
        # manage the record update
        print(f"Article {urlid} already exists!")

但是,尽管所有其他字段都工作良好,添加stanzanerlist会产生以下误差:

cannot encode object: {
  "text": "Harry Potter",
  "type": "PER",
  "start_char": 141,
  "end_char": 153
}, of type: <class 'stanza.models.common.doc.Span'>

我不明白我是否以及怎样才能实现这个加法。

toe95027

toe950271#

pymongo本身不知道如何将<class 'stanza.models.common.doc.Span'>类型转换为可接受的BSON数据类型。
你可以 “教”pymongo如何使用定制的bson.codec_options.TypeEncoder进行正确的转换/编码,然后pymongo会自动执行类型转换,就像它对其他类型所做的那样。或者,你可以在每次将Span存储到MongoDB集合之前自己进行转换/编码。
幸运的是,斯坦福大学NLP Stanza有一些方便的类型转换方法。<class 'stanza.models.common.doc.Span'>有一个to_dict方法,可以将类型转换为Dict类型,pymongo知道如何编码。
因此,在代码片段中,可以将"stanzanerlist"mongodocument赋值更改为:

"stanzanerlist": [stan.to_dict() for stan in stanzanerlist]

......然后每个<class 'stanza.models.common.doc.Span'>将被转换为一个Dict,并且pymongo应该能够存储它。

相关问题