首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从没有空格的句子中分离出单词

从没有空格的句子中分离出单词
EN

Stack Overflow用户
提问于 2020-06-29 10:40:05
回答 1查看 71关注 0票数 1

我基本上有两个相关的问题。

首先,我有下面的数据集。

代码语言:javascript
复制
['Dividingpolynomials', 'Categoricaldataandprobabilities', 'Systemsoflinearequations', 'Scatterplotsandgraphs', 'Dividingpolynomials', 'Dividingpolynomials', 'Dividingpolynomials', 'Categoricaldataandprobabilities', 'Dividingpolynomials', 'Scatterplotsandgraphs', 'Scatterplotsandgraphs', 'Scatterplotsandgraphs', 'Dividingpolynomials', 'Scatterplotsandgraphs', 'Dividingpolynomials', 'Dividingpolynomials', 'Dividingpolynomials', 'Manipulatingpolynomials', 'Dividingpolynomials', 'Scatterplotsandgraphs']

我想知道如何编辑数组以更好地格式化它。

期望的结果类似于["Dividing Polynomials", "Categorical Data and Probabilities", "Systems of Linear Equations", "Scatterplots and Graphs", "Manipulating Polynomials"]

这是在Python中实现的,结果也应该是一个数组。

第二个问题要简单得多:

对于不同的节,我的代码格式化了一个不同的数据集,它工作得很好。

唯一的问题是And是大写的,我似乎不能修改它来使和小写。

代码已经写好了,只需要稍作调整即可。

代码语言:javascript
复制
temptopiclist = [re.sub(r"and([A-Z])", r"And\1", element) for element in temptopiclist]
topiclist = [re.sub(r"(\w)([A-Z])", r"\1 \2", element).title() for element in temptopiclist]
          
print(topiclist, "<br>", "<br>")

需要修复的结果数据集:

代码语言:javascript
复制
['Advanced Algebra', 'Problem Solving And Data Analysis', 'Basic Algebra', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Problem Solving And Data Analysis', 'Problem Solving And Data Analysis', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Problem Solving And Data Analysis']
EN

回答 1

Stack Overflow用户

发布于 2020-07-14 22:56:33

对于您的第二个问题,您可以像前面提到的那样进行搜索和替换:

代码语言:javascript
复制
text.replace(" And ", " and ")

至于你的第一个问题,正如Klaus在评论中正确地提到的那样,putting words together is trivial, dividing them is very hard.

然而,解决困难的问题很有趣。

解决这个问题的一种方法是使用递归和dynamic programming

请注意,您将需要访问常用英语单词的字典。

如果您知道数据集中存在的所有单词,则可以在words_dict列表中输入它们。

否则,您将需要在英语词典中获得一个公开可用的单词列表。

trie代码可以从here获得。

代码语言:javascript
复制
from collections import deque
from trie import Trie


def partition_valid_words(start_pos, end_pos, trie, input_phrase, cache):
    pos_pair = (start_pos, end_pos)
    if pos_pair in cache:
        return cache[pos_pair]
    if start_pos > end_pos:
        dq = deque()
        dq.append(None)
        cache[pos_pair] = dq
        return cache[pos_pair]
    if start_pos == end_pos:
        if trie.search(input_phrase[start_pos]) == 1:
            dq = deque()
            dq.append((start_pos, start_pos))
            cache[pos_pair] = dq
            return cache[pos_pair]
        cache[pos_pair] = None
        return cache[pos_pair]
    for break_pos in range(start_pos, end_pos + 1):
        phrase_substring = input_phrase[start_pos : break_pos + 1]
        search_result = trie.search(phrase_substring)
        if search_result == 0:
            break
        if search_result == 2:
            continue
        sub_ans_dq = partition_valid_words(break_pos + 1, end_pos, trie, input_phrase, cache)
        if sub_ans_dq is None:
            continue
        sub_ans_dq.appendleft((start_pos, break_pos))
        cache[pos_pair] = sub_ans_dq
        return cache[pos_pair]
    cache[pos_pair] = None
    return cache[pos_pair]


def add_spaces(dq, input_phrase):
    if dq is None:
        return None
    sentence = []
    for elem in dq:
        if elem is None or len(elem) < 2:
            continue
        word = input_phrase[elem[0]: elem[1]+1]
        sentence.append(word)
    return sentence


def main():
    input_phrase = "categoricaldataandprobabilities"
    words_dict = ['categorical', 'data', 'and', 'probabilities']
    trie = Trie()
    for word in words_dict:
        trie.insert(word)
    ans = partition_valid_words(0, len(input_phrase) - 1, trie, input_phrase, {})
    ans = ' '.join(add_spaces(ans, input_phrase))
    print(ans)


main()

你需要注意大小写。

在数据集中,第一个字母是大写的。

由于我们在递归算法中执行区分大小写的匹配,因此必须首先使所有数据集完全小写。

您可以将结果数据集的第一个字母再次转换为大写字母。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62630434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档