我需要将脚本从python 3移植到python 2,该脚本只需要一个单词并生成单词的所有可能的分段,并返回最可能的分段。当生成分割的候选者时,python2和python3给出了截然不同的结果。这是我正在使用的代码:

def splits(text, start=0, s=20):
    """Return a list of all (first, rest) pairs; start <= len(first) <= L."""
     return [(text[:i], text[i:])
            for i in range(start, min(len(text), s)+1)]

def __segment__(self, text):
    """Return a list of words that is the most probable segmentation of text."""
    if not text:
        return []
    else:
        candidates = [[first] + self.__segment__(rest)
                      for (first, rest) in splits(text, 1)]
        print(candidates)
        return max(candidates, key=self.p_words)


当打印候选人时,我得到以下答案,我要细分的单词是“ casadecampo”,结果应该是“ casa de campo”:

Python2

[[u'o']]
[[u'p', u'o'], [u'po']]
[[u'm', u'p', u'o'], [u'mp', u'o'], [u'mpo']]
[[u'a', u'm', u'p', u'o'], [u'am', u'p', u'o'], [u'amp', u'o'], [u'ampo']]
[[u'c', u'a', u'm', u'p', u'o'], [u'ca', u'm', u'p', u'o'], [u'cam', u'p', u'o'], [u'camp', u'o'], [u'campo']]
[[u'e', u'c', u'a', u'm', u'p', u'o'], [u'ec', u'a', u'm', u'p', u'o'], [u'eca', u'm', u'p', u'o'], [u'ecam', u'p', u'o'], [u'ecamp', u'o'], [u'ecampo']]
[[u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'de', u'c', u'a', u'm', u'p', u'o'], [u'dec', u'a', u'm', u'p', u'o'], [u'deca', u'm', u'p', u'o'], [u'decam', u'p', u'o'], [u'decamp', u'o'], [u'decampo']]
[[u'a', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'ad', u'e', u'c', u'a', u'm', u'p', u'o'], [u'ade', u'c', u'a', u'm', u'p', u'o'], [u'adec', u'a', u'm', u'p', u'o'], [u'adeca', u'm', u'p', u'o'], [u'adecam', u'p', u'o'], [u'adecamp', u'o'], [u'adecampo']]
[[u's', u'a', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'sa', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'sad', u'e', u'c', u'a', u'm', u'p', u'o'], [u'sade', u'c', u'a', u'm', u'p', u'o'], [u'sadec', u'a', u'm', u'p', u'o'], [u'sadeca', u'm', u'p', u'o'], [u'sadecam', u'p', u'o'], [u'sadecamp', u'o'], [u'sadecampo']]
[[u'a', u's', u'a', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'as', u'a', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'asa', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'asad', u'e', u'c', u'a', u'm', u'p', u'o'], [u'asade', u'c', u'a', u'm', u'p', u'o'], [u'asadec', u'a', u'm', u'p', u'o'], [u'asadeca', u'm', u'p', u'o'], [u'asadecam', u'p', u'o'], [u'asadecamp', u'o'], [u'asadecampo']]
[[u'c', u'a', u's', u'a', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'ca', u's', u'a', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'cas', u'a', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'casa', u'd', u'e', u'c', u'a', u'm', u'p', u'o'], [u'casad', u'e', u'c', u'a', u'm', u'p', u'o'], [u'casade', u'c', u'a', u'm', u'p', u'o'], [u'casadec', u'a', u'm', u'p', u'o'], [u'casadeca', u'm', u'p', u'o'], [u'casadecam', u'p', u'o'], [u'casadecamp', u'o'], [u'casadecampo']]


我得到的解决方案是'ca a d e c a m p o'

Python3

[['o']]
[['p', 'o'], ['po']]
[['m', 'po'], ['mp', 'o'], ['mpo']]
[['a', 'mp', 'o'], ['am', 'po'], ['amp', 'o'], ['ampo']]
[['c', 'amp', 'o'], ['ca', 'mp', 'o'], ['cam', 'po'], ['camp', 'o'], ['campo']]
[['e', 'campo'], ['ec', 'amp', 'o'], ['eca', 'mp', 'o'], ['ecam', 'po'], ['ecamp', 'o'], ['ecampo']]
[['d', 'e', 'campo'], ['de', 'campo'], ['dec', 'amp', 'o'], ['deca', 'mp', 'o'], ['decam', 'po'], ['decamp', 'o'], ['decampo']]
[['a', 'de', 'campo'], ['ad', 'e', 'campo'], ['ade', 'campo'], ['adec', 'amp', 'o'], ['adeca', 'mp', 'o'], ['adecam', 'po'], ['adecamp', 'o'], ['adecampo']]
[['s', 'a', 'de', 'campo'], ['sa', 'de', 'campo'], ['sad', 'e', 'campo'], ['sade', 'campo'], ['sadec', 'amp', 'o'], ['sadeca', 'mp', 'o'], ['sadecam', 'po'], ['sadecamp', 'o'], ['sadecampo']]
[['a', 'sade', 'campo'], ['as', 'a', 'de', 'campo'], ['asa', 'de', 'campo'], ['asad', 'e', 'campo'], ['asade', 'campo'], ['asadec', 'amp', 'o'], ['asadeca', 'mp', 'o'], ['asadecam', 'po'], ['asadecamp', 'o'], ['asadecampo']]
[['c', 'as', 'a', 'de', 'campo'], ['ca', 'sade', 'campo'], ['cas', 'a', 'de', 'campo'], ['casa', 'de', 'campo'], ['casad', 'e', 'campo'], ['casade', 'campo'], ['casadec', 'amp', 'o'], ['casadeca', 'mp', 'o'], ['casadecam', 'po'], ['casadecamp', 'o'], ['casadecampo']]


解决这个问题的方法是“ casa de campo”。

为什么我为python 2和3获得了不同的解决方案?

编辑:添加了“拆分”功能

最佳答案

我发现了问题,它一定是python2中的整数除法,它考虑了所有概率0,因为我做了int / int。更改代码以进行float / int。

关于python - list 2和3之间的 list 理解差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49629657/

10-09 08:02