Python函数可将串在一起的单词分解为单个单词

时间:2018-11-26 19:34:30

标签: python nlp

我正在尝试提出一个函数,该函数接受

之类的条目
  

“ businessidentifier”,“名字”,“街道地址”

并输出

  

“业务标识符”,“名字”,“街道地址”

这似乎是一个涉及NLP的相当复杂的问题,因为该函数将必须遍历字符串并针对词汇表进行测试以查看其何时到达词汇表中的某个单词,但是对于第一个示例,“ businessidentifier”可能首先被视为“总线标识符”。有没有人遇到可以完成此任务的功能?

1 个答案:

答案 0 :(得分:2)

首先,我们需要获得很多英语单词,我在这里使用nltk。然后,我将所有单词加载到dict中,以便所有以“ a”开头的单词都位于键“ a”下的dict eng_dict中,以加快搜索单词的速度。然后,我将所有单词按其长度排序,以便当我们在句子中查找单词时,我们将首先尝试将其与最长的单词匹配,因此给定“ businessidentifier”,我们将首先检查“ business”而不是“ bus” 。 现在我们的单词格式很好,我们可以创建函数以将句子与该单词匹配。在这里,我创建了一个递归函数,该函数尝试匹配所有以与句子相同的字母开头的单词,如果找到一个单词,则将其添加到返回列表中,并循环查找下一个单词。

from nltk.corpus import words
word_list = words.words()

eng_dict = {chr(i): sorted([word for word in word_list if word[0] == chr(i)], key=len, reverse=True) for i in range(ord('a'), ord('z')+1)}

def split_into_words(x):
    ret = []
    for word in eng_dict[x[0]]:
        if x.startswith(word):
            ret.append(word)
            x = x[len(word):]
            break
    if len(x) != 0:
        ret.extend(split_into_words(x))
    return ret

raw_sentences = ["businessidentifier", "firstname", "streetaddress"]
finall_sentence = [split_into_words(i) for i in raw_sentences]

print(finall_sentence)

输出:

[['business', 'identifier'], ['first', 'name'], ['street', 'address']]