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());
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”是同一个人。这应该在另一个层面上加以解决。在
你能只用正则表达式吗?根据文本文件的不同,您可能需要使用多行匹配,如下所示。在
您也可以使用命令行实用程序来实现这一点,例如
pcregrep
-请参见related question。在更新:为了解决存储名称的问题,一个用于存储相关字符串的内存高效结构是Trie,这可能很有用——可能有很多免费的实现,但据我所知,Java标准库中没有。请参见this question和{a4}以获取一些建议。在
据我所知,您必须存储每个作者的任意名称列表,并有效地匹配它们。在
我假设您已经解决了解析名称的问题,删除了诸如“Dr”之类的非必要/可选部分,并保留了诸如“von”和“de”之类的粒子。规范化名称必须是固定大小写的字符串序列(小写可以,但我还是坚持大写或标题大小写)。在
现在,}将作为包含其他详细信息的
List<String>
或{HashMap
的键。这恐怕行不通,因为这两种方法都是可变的,我不确定它们的hashCode()
方法是否适合这种情况。在所以我会想出这样的办法:
这并不能解决许多可能的问题,比如“Joe Random User”、“Joe R User”和“J.R.User”是同一个人。这应该在另一个层面上加以解决。在
如果你用一两个例子更详细地陈述你的情况,答案会更好。在
您可能还对库规范化作者姓名的方式感兴趣。人们用elaborateschemes来匹配名字。在
相关问题 更多 >
编程相关推荐