5

背景

将数据库列名称拆分为等效的英文文本以作为数据字典的种子。英语词典是根据公司文档、wiki 和电子邮件的语料库创建的。字典 ( lexicon.csv) 是一个包含单词和概率的 CSV 文件。因此,某人写“治疗师”一词的频率越高(在电子邮件或维基页面上),“治疗师姓名”分裂为“治疗师姓名”而不是其他内容的机会就越高。(词典可能甚至不包括强奸犯这个词。)

源代码

数据文件

问题(2011-01-03 更新)

当遇到以下问题时:

dependentrelationship::end depend ent dependent relationship
end=0.86
ent=0.001
dependent=0.8
relationship=0.9

存在这些可能的解决方案:

dependentrelationship::dependent relationship
dependentrelationship::dep end ent relationship
dependentrelationship::depend ent relationship

词典包含具有相对概率(基于词频)的词:dependent 0.8end 0.86relationship 0.9depend 0.3ent 0.001

消除dep end ent relationship因为dep不在词典中的解决方案(即 75% 的单词使用率),而其他两个解决方案涵盖了词典中 100% 的单词。在其余解决方案中, 的概率dependent relationship0.72depend ent relationship0.00027。因此,我们可以选择dependent relationship正确的解决方案。

有关的

问题

鉴于:

// The concatenated phrase or database column (e.g., dependentrelationship).
String concat;

// All words (String) in the lexicon within concat, in left-to-right order; and
// the ranked probability of those words (Double). (E.g., {end, 0.97}
// {dependent, 0.86}, {relationship, 0.95}.)
Map.Entry<String, Double> word;

您将如何实现一个基于词典覆盖率和概率生成最可能解决方案的例程?例如:

for( Map.Entry<String, Double> word : words ) {
  result.append( word.getKey() ).append( ' ' );

  // What goes here?

  System.out.printf( "%s=%f\n", word.getKey(), word.getValue() );
}

谢谢!

4

3 回答 3

1

Peter Norvig 用 python 写了一些东西。

http://norvig.com/ngrams/ngrams.py

包含一个称为段的函数。它运行一系列单词的朴素贝叶斯概率。效果很好。可以成为您尝试在 java 中完成的工作的良好基础。

如果您将其转换为 java,我将有兴趣查看实现。

谢谢。

麦克风

于 2011-01-24T15:44:43.660 回答
0

我会稍微不同地处理这个问题。“结束”和“依赖”重叠很重要,但在您的单词地图中丢失了。如果您要创建一组词图而不是单个词图,每个词图代表列名的可能分段,仅由不重叠的词组成,您可以根据词的概率计算每个分段的分数和字长。分割的分数将是分割中单个单词的分数的平均值。单个单词的分数将是单词长度(l)和概率(p)的某种函数,例如

分数=al + bp
其中 a 和 b 是您可以调整以获得正确组合的权重。平均每个单词的分数以获得分割的分数,并选择分数最高的分割。得分函数也不必是线性加权,您可以尝试对数、指数或高阶多项式(例如平方)

于 2011-01-02T22:58:48.533 回答
0

你的问题在 NLP 中是一个非常常见的问题——不要从重新发明轮子开始——这会花费你很长时间,而且不如现有的好。

您当然应该从查看 NLP 库必须提供的内容开始:http ://en.wikipedia.org/wiki/Natural_language_processing和http://en.wikipedia.org/wiki/Category:Natural_language_processing_toolkits。您的问题是一个常见问题,您需要为您的语料库探索不同的方法。

您的分词可能会在连字符例程下找到。两种可能的方法是 n-gram(其中(比如说)4 个字符的子串的频率用于预测边界)和尝试显示单词的常见开头或结尾。其中一些可能有助于解决拼写错误。

但没有简单的答案 - 找到最适合您的方法。

于 2011-01-02T23:09:51.927 回答