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

背景

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

源代码

  • TextSegmenter.java @ http://pastebin.com/taXyE03L
  • SortableValueMap.java @ http://pastebin.com/v3hRXYan

数据文件

  • lexicon.csv – http://pastebin.com/0crECtXY
  • columns.txt – http://pastebin.com/EtN9Qesr

问题(更新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.3 ,和ent 0.001

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

有关

  • 如何用空格分隔“句子”中的单词?
  • 顶级编码器 – 文本分段演示文稿1/2
  • 顶级编码器 – 文本分段演示文稿2/2
  • 基于动态规划算法的线性文本分割
  • 动态编程:分段
  • 动态编程:计算工具

鉴于:

 // The concatenated phrase or database column (eg, dependentrelationship). String concat; // All words (String) in the lexicon within concat, in left-to-right order; and // the ranked probability of those words (Double). (Eg, {end, 0.97} // {dependent, 0.86}, {relationship, 0.95}.) Map.Entry word; 

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

 for( Map.Entry word : words ) { result.append( word.getKey() ).append( ' ' ); // What goes here? System.out.printf( "%s=%f\n", word.getKey(), word.getValue() ); } 

谢谢!

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

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

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

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

谢谢。

麦克风

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

 得分= al + bp 

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

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

首先,您应该看看NLP库提供的内容: http : //en.wikipedia.org/wiki/Natural_language_processing和http://en.wikipedia.org/wiki/Category:Natural_language_processing_toolkits 。 您的问题很常见,您需要为语料库探索不同的方法。

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

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