【问题标题】:Insert spaces based on words/dictionary根据单词/字典插入空格
【发布时间】:2010-08-31 03:26:05
【问题描述】:

我正在寻找一种方法来获取没有空格的短语(例如 twitter 上的热门话题),并根据短语中的单词在适当的位置放置空格。大概与字典进行某种比较会起作用吗?

例如:我有一个函数接受短语“septemberwish”(Twitter 上的当前趋势),它会返回“september wish”。

【问题讨论】:

    标签: php


    【解决方案1】:

    这会很棘手。您很容易得到模棱两可的单词合并,其中多次分离会产生有效的单词。

    也就是说,您可以使用拼写检查器。请参阅pspell 扩展。

    算法可以将单词分隔为不同的点,直到产生两个有效单词。示例:

    septem berwish(在楼层拆分(长度/2);均无效) septemb erwish(在楼层分割(长度/2)+1;均无效) septe mberwish(在楼层拆分(长度/2)-1;均无效) septembe rwish(在楼层分割(长度/2)+2;均无效) sept emberwish(在楼层拆分(长度/2)-2;第一个有效,第二个无效) 九月愿望(在楼层分割(长度/2)+3;都有效;停止)

    对于两个以上的词,需要另一种方法。一种可能性是从末尾删除字符,直到您有一个有效的单词,然后对未匹配的其余部分执行相同操作:

    九月愿望二(无效) septemberwishtw(无效) ... 九月(有效;获得第一名) 愿望二(无效) ... 希望(有效;得到第二个) 两个(有效;获得第三个)

    【讨论】:

    • 这适用于 2 个单词的短语,但对于超过 2 个单词的短语更难实现?它很快就会变得非常复杂!
    • 如果您假设它是两个词,则不是从中间开始才有帮助。我对推特一无所知,但一四个字就不能这么简单吗?
    • +1 for pspell,虽然我喜欢从一开始就解析的想法,正如@Piskvor 所建议的那样。
    • @Finn 好的,我添加了另一个算法。
    • @Artefacto:好吧,我会正确解析 Pen Island,而您将正确解析 连字符站点。想知道是否有办法将向后和向前的方法结合起来。
    【解决方案2】:

    在最简单的实现中,从字符串的开头开始添加字母,并与给定长度的字典进行比较:例如

    s // no match
    se // no match
    sep // no match
    ...
    september // match! add space, add to output
    // continue where we left off
    w // no match
    wi // no match
    wis // no match
    wish // match! add space, add to output
    end of string, terminate
    

    棘手的一点是:可能有一些字符串可以被解析成各种短语(the-site-that-shall-not-be-named,例如)。实际上,你的例子就是一个(虽然一个词并不常见):

    septemberwish vs septemberwish

    我想您可以先尝试使用较小的常用词词典,或者先尝试最长的词;或者给不常用的词一个较低的权重。

    【讨论】:

    • 我也是这么想的,但是当它是一个以'a','the'等开头的单词时,似乎你必须回去重新开始。
    • @grossvogel:可能需要进行一些回溯;尽管在这种特殊情况下,我想说 Twitter 很方便地为我们过滤了这些词(否则“the”将是 the 有史以来的趋势(请原谅双关语)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2010-10-14
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多