0

我有两张桌子。

在一个表中有两列,一列有 ID,另一列是大约 300-500 字长的文档摘要。大约有 500 行。

另一个表只有一列和 >18000 行。该列的每个单元格都包含一个不同的首字母缩写词,例如 NGF、EPO、TPO 等。

我对一个脚本感兴趣,该脚本将扫描表 1 的每个摘要并识别其中存在的一个或多个首字母缩略词,这些首字母缩略词也存在于表 2 中。

最后,程序将创建一个单独的表,其中第一列包含表 1 的第一列的内容(即 ID)以及在与该 ID 关联的文档中找到的首字母缩略词。

有 Python、Perl 或任何其他脚本语言专业知识的人可以提供帮助吗?

4

3 回答 3

1

在我看来,您正在尝试将首字母缩略词出现在摘要中的两个表连接起来。即(伪SQL):

SELECT acronym.id, document.id
FROM acronym, document
WHERE acronym.value IN explode(documents.abstract)

给定所需的语义,您可以使用最直接的方法:

acronyms = ['ABC', ...]
documents = [(0, "Document zeros discusses the value of ABC in the context of..."), ...]

joins = []

for id, abstract in documents:
    for word in abstract.split():
        try:
            index = acronyms.index(word)
            joins.append((id, index))
        except ValueError:
            pass # word not an acronym

这是一个简单的实现;然而,它有 n 立方运行时间,因为 acronyms.index 执行线性搜索(我们最大的数组,不少于)。我们可以通过首先构建首字母缩写词的哈希索引来改进算法:

acronyms = ['ABC', ...]
documents = [(0, "Document zeros discusses the value of ABC in the context of..."), ...]

index = dict((acronym, idx) for idx, acronym in enumberate(acronyms))    
joins = []

for id, abstract in documents:
    for word in abstract.split():
        try
            joins.append((id, index[word]))
        except KeyError:
            pass # word not an acronym

当然,您可能要考虑使用实际的数据库。这样您就不必手动实现连接。

于 2009-01-19T17:59:28.643 回答
0

非常感谢您的快速回复。我假设伪 SQL 解决方案适用于 MYSQL 等。但是它在 Microsoft ACCESS 中不起作用。

第二个和第三个是我假设的 Python。我可以提供首字母缩写词和文档作为输入文件吗?巴布鲁

于 2009-01-19T19:22:47.463 回答
0

它在 Access 中不起作用,因为表的访问方式不同(例如 acronym.[id])

于 2009-01-19T19:45:04.500 回答