Python 文本语料库的数据结构

Python 文本语料库的数据结构,python,database,database-design,sqlite,nlp,Python,Database,Database Design,Sqlite,Nlp,文本语料库通常以xml表示,如下所示: <corpus name="foobar" date="08.09.13" authors="mememe"> <document filename="br-392"> <paragraph pnumber="1"> <sentence snumber="1"> <word wnumber="1" partofspeech="VB" sensetag="01234

文本语料库通常以xml表示,如下所示:

<corpus name="foobar" date="08.09.13" authors="mememe">
  <document filename="br-392">
    <paragraph pnumber="1">
      <sentence snumber="1">
        <word wnumber="1" partofspeech="VB" sensetag="012345678-v" nameentity="None">Hello</word>
        <word wnumber="2" partofspeech="NN" sensetag="876543210-n" nameentity="World">Foo bar</word>
      </sentence>
    </paragraph>
  </document>
</corpus>
数据库的用途是让我可以像这样运行查询

SELECT * from ENG if paragraph=1;
SELECT * from ENG if sentence=1;
SELECT * from ENG if sentence=1 and pos="NN" or sensetag="87654321-n"
SELECT * from ENG if pos="NN" and sensetag="87654321-n"
SELECT * from ENG if docfilename="br-392"
SELECT * from ENG if corpusname="foobar"
当我像上面那样构建数据库时,我的数据库规模爆炸了,因为每个语料库中的标记数量可以达到数百万或数十亿

除了通过让每一行对应一个单词,每一列对应其属性和父属性来构建语料库之外,我还能如何构建数据库,以便执行查询并获得相同的输出?

为了索引大型语料库

  • 我应该使用sqlite3以外的其他数据库程序吗

  • 我是否仍然应该使用与上面定义的相同的表模式


  • 我想显而易见的答案是“正常化”。。。每行有大量重复信息,这将大大增加数据库的大小

    您应该从每一行中找出重复的内容,然后创建一个包含该数据的表,然后将包含语料库长度(例如,20个字符)的重复字符串缩减为指向“语料库名称”中某一行的指针表,为了参数起见,该表可能只接受4个字符作为该项的ID值

    你也不会说你在使用什么平台。如果它是一款移动设备,那么尽可能多地规范您的数据确实值得。这会使代码变得更复杂,但这始终是像这样的东西在空间/时间上的权衡。我猜这是一种参考应用,在这种情况下,纯粹的致盲速度可能是次要的,只是让它工作

    的强制维基百科链接

    还有这个

    谷歌是你的朋友,希望对你有所帮助。:)肖恩

    我是否仍然应该对表使用与我定义的相同的模式 在上面

    从关系数据库设计的角度来看,由于,我将对xml文件的每个元素使用一个表
    我们将节省空间并提高DBMS性能
    使用该模型,可以应用所需的查询
    模型草案将为:

    我应该使用sqlite3以外的其他数据库程序吗

    这可能会根据您的应用程序规范来回答,例如您在一个月、一年之后将拥有多少数据记录,将连接多少用户,是OLTP还是OLAP还是混合,项目预算和
    顺便说一句,看看免费的R-DBMS,比如PostgreSQL、MySQL和商业数据库,比如Oracle

    对于NoSql解决方案,查看一下可能会很有帮助

    只需阅读该页并大笑!不过,我想提出一些要点。出于效率原因,同意将非正常化作为最后手段。在这种情况下,我认为它实际上会有所帮助。
    SELECT * from ENG if paragraph=1;
    SELECT * from ENG if sentence=1;
    SELECT * from ENG if sentence=1 and pos="NN" or sensetag="87654321-n"
    SELECT * from ENG if pos="NN" and sensetag="87654321-n"
    SELECT * from ENG if docfilename="br-392"
    SELECT * from ENG if corpusname="foobar"