用于匹配tex名称的数据结构

2024-10-01 19:21:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想查找在文本文件中引用的名称。作者可以有任意数量的姓名和头衔。只有当所有名字都匹配时才会找到匹配项(例如,名为“John Doe”的人在只包含“John”的文本中不匹配

我现在解决这个问题的方法是将名称拆分为标记,并将第一个标记存储在哈希集中,并将小写字符串作为键。每个令牌包含名称中的下一个令牌集,依此类推。在

这会导致大量的HashSet对象增加开销。我想有更好的方法来处理这个?如果可能的话,我更喜欢图书馆,但任何东西都会有帮助

如果有好的解决方案,我愿意改用Python。在


Tags: 方法字符串标记文本名称数量作者名字
2条回答

你能只用正则表达式吗?根据文本文件的不同,您可能需要使用多行匹配,如下所示。在

    Pattern p = Pattern.compile("John\\s+Doe", Pattern.MULTILINE);
    Matcher m = p.matcher("I am looking for John \nDoe, I am.");        
    System.out.println(m.find());

您也可以使用命令行实用程序来实现这一点,例如pcregrep-请参见related question。在

更新:为了解决存储名称的问题,一个用于存储相关字符串的内存高效结构是Trie,这可能很有用——可能有很多免费的实现,但据我所知,Java标准库中没有。请参见this question和{a4}以获取一些建议。在

据我所知,您必须存储每个作者的任意名称列表,并有效地匹配它们。在

我假设您已经解决了解析名称的问题,删除了诸如“Dr”之类的非必要/可选部分,并保留了诸如“von”和“de”之类的粒子。规范化名称必须是固定大小写的字符串序列(小写可以,但我还是坚持大写或标题大小写)。在

现在,List<String>或{}将作为包含其他详细信息的HashMap的键。这恐怕行不通,因为这两种方法都是可变的,我不确定它们的hashCode()方法是否适合这种情况。在

所以我会想出这样的办法:

class AuthorName(object) {
  private String[] parts;
  public AuthorName(String... name_parts) {
    assert name_parts.length > 0;
    parts = name_parts;
  }

  @Override
  public int hashCode() {
    // hashCode() that only depends on name parts
    int result = 0;
    for (int i=0; i < parts.length; i+=1) result ^= part.hashCode();
    return result;
  }
}

Map<AuthorName, ...> authors = new HashMap<AuthorName, ...>();
authors.put(new AuthorName('John', 'Doe'), ...);
assert authors.get(new AuthorName('John', 'Doe')) != 0

这并不能解决许多可能的问题,比如“Joe Random User”、“Joe R User”和“J.R.User”是同一个人。这应该在另一个层面上加以解决。在

如果你用一两个例子更详细地陈述你的情况,答案会更好。在

您可能还对库规范化作者姓名的方式感兴趣。人们用elaborateschemes来匹配名字。在

相关问题 更多 >

    热门问题