【问题标题】:Separating out words from sentence without spaces从没有空格的句子中分离单词
【发布时间】:2020-06-29 02:40:05
【问题描述】:

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

首先,我在下面有这个数据集。

['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 是大写的,我似乎无法修改它以使其成为小写。
代码写好了,稍微调整一下就好了。

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>")

需要修复的结果数据集:

['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']

【问题讨论】:

  • 对于你的第一个问题:把单词放在一起是微不足道的,把它们分开是很困难的。
  • “我想知道如何编辑数组以更好地格式化它。”告诉您在哪里进行拆分的规则是什么?为什么数据首先看起来像这样?最好从一开始就确保空间存在。
  • “唯一的问题是 And 是大写的,我似乎无法修改它来使 and 小写。”告诉您And 应该是小写的规则是什么?其他应该是小写的吗?
  • @KarlKnechtel 我想要 And 小写。仅在我的数据集中并且需要小写
  • text.replace(" And ", " and ")

标签: python string algorithm recursion dynamic-programming


【解决方案1】:

对于您的第二个问题,您可以按照 furas 所述进行搜索和替换:

text.replace(" And ", " and ")

至于你的第一个问题,正如克劳斯在 cmets 中正确提到的那样,putting words together is trivial, dividing them is very hard.

但是,解决难题很有趣。

解决此问题的一种方法是使用递归和dynamic programming
请注意,您需要能够访问英语常用词词典。
如果您知道数据集中存在的所有单词,您可以将它们输入到words_dict 列表中。
否则,您需要在英语词典中获取公开可用的单词列表。

trie码可以从here获取。

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()

您需要注意大小写。
在您的数据集中,第一个字母大写。
由于我们在递归算法中进行了区分大小写的匹配,因此我们必须首先将所有数据集完全小写。
您可以将结果数据集的第一个字母再次转换为大写字母。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多