文本分割:基于字典的单词拆分

时间:2011-01-02 22:32:26

标签: java nlp data-dictionary text-segmentation

背景

将数据库列名拆分为等效的英文文本以播种数据字典。英语词典是从公司文档,维基和电子邮件的语料库中创建的。字典(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。< / p>

消除dep end ent relationship的解决方案,因为dep不在词典中(即75%的单词使用率),而其他两个解决方案涵盖了词典中100%的单词。在其余解决方案中,dependent relationship的概率 0.72 depend ent relationship 0.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() );
}

谢谢!

3 个答案:

答案 0 :(得分:1)

Peter Norvig在python中写了一些东西。

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

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

如果你把它转换成java,我会对看到它的实现感兴趣。

感谢。

麦克

答案 1 :(得分:0)

我会稍微改变一下这个问题。重要的是“结束”和“依赖”重叠,但在你的单词Map中丢失了。如果您要创建一组字图而不是单个字图,而每个字图都表示列名称的可能分段(仅由非重叠字组成),您可以根据字的概率计算每个分段的分数和字长。分段的分数将是分段中各个单词的分数的平均值。单个单词的分数将是单词长度(l)和概率(p)的某个函数,类似于

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

答案 2 :(得分:0)

你的问题在NLP中是非常常见的 - 不要从重新发明轮子开始 - 这将花费你很长时间而不是已经那么好了。

首先,您应该看看NLP库提供的内容:http://en.wikipedia.org/wiki/Natural_language_processinghttp://en.wikipedia.org/wiki/Category:Natural_language_processing_toolkits。您的问题很常见,您需要针对语料库进行探索。

您的单词拼写可以在连字例程下找到。两种可能的方法是n-gram(其中(例如)4字符子串的频率用于预测边界)并且尝试显示单词的共同开始或结束。其中一些可能有助于拼写错误。

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