如何在python中从连接的字符串中提取有意义和频繁的单词?

如何在python中从连接的字符串中提取有意义和频繁的单词?,python,python-3.x,nlp,nltk,spacy,Python,Python 3.x,Nlp,Nltk,Spacy,我有一个串联字符串列表,如下所示,我希望将其拆分为有意义的频繁的单词。我创建的代码也给了我各种不常用的单词 con_words = ["stainlesssteel", "screwhammerwing", "goldplated", "bearingball", "inchcountry"] 预期产出: {"stainlesssteel": ["stainless", "steel"], "screwhammerwing": ["screw", "hammer", "wing"], "g

我有一个串联字符串列表,如下所示,我希望将其拆分为有意义的频繁的单词。我创建的代码也给了我各种不常用的单词

con_words = ["stainlesssteel", "screwhammerwing", "goldplated", "bearingball", "inchcountry"]
预期产出:

{"stainlesssteel": ["stainless", "steel"], 
"screwhammerwing": ["screw", "hammer", "wing"], 
"goldplated": ["gold", "plated"], 
"bearingball": ["bearing", "ball"], 
"inchcountry": ["inch", "country"]}
我的代码

from nltk.corpus import words
from nltk.corpus import stopwords

#list of all words from english dictionary
words = words.words()

#list of all english stopwords
stops = list(set(stopwords.words('english')))

alphabets = [chr(x) for x in range(ord('a'), ord('z') + 1)]
cleaned_word_list = list(set(words)|set(stops))
cleaned_word_list = list(set(cleaned_word_list)|set(alphabets))
cleaned_word_dict = dict((i, 0) for i in cleaned_word_list)

def extract_words(x):
    res = []
    subs = [x[i:j+1] for i in range(len(x)) for j in range(i,len(x))if (i - (j+1)) < -1]
    for sub in subs:
        try:
            l = cleaned_word_dict[sub]
            res.append(str(sub))
        except:
            pass

    return sorted(res, key = len, reverse=True)

common_words_dict = dict((i, extract_words(str(i))[:5]) for i in con_words)
还有别的方法吗

请帮助我了解如何获得预期的输出


提前感谢

我认为获得预期输出的最简单方法(尽管它可能会占用大量内存)是在第一个输出上运行extract_words()函数,但删除其他答案中包含的单词。这将防止出现零碎的单词(‘不锈钢’-‘污渍’;‘锤子’-‘安默’),并且仍然允许出现多个完整单词。
一旦我做了一些有用的东西,我将用代码更新我的答案。

我认为获得预期输出(尽管它可能会占用大量内存)的最简单方法是在第一个输出上运行extract_words()函数,但删除其他答案中包含的单词。这将防止出现零碎的单词(‘不锈钢’-‘污渍’;‘锤子’-‘安默’),并且仍然允许出现多个完整单词。
一旦我做了一些有用的东西,我会用代码更新我的答案。

你的代码正是按照你的要求去做的,简而言之,你是在告诉你的程序“根据这个语料库给我这个单词中所有的字符串组合”。如果你只想要前两个答案,我建议你把所有的结果放在一个列表中,并相应地对列表进行切片。你的代码正是按照你的要求执行的,简而言之,你告诉你的程序“根据这个语料库,给我这个单词中所有字符串的组合”。如果你只想要前两个答案,我建议把你所有的结果放在一个列表中,并相应地对列表进行切片。
{'stainlesssteel': ['stainless', 'stain', 'steel', 'tain', 'less'],
 'screwhammerwing': ['hammer', 'screw', 'ammer', 'crew', 'wham'],
 'goldplated': ['plated', 'plate', 'lated', 'gold', 'plat'],
 'bearingball': ['bearing', 'earing', 'bear', 'ring', 'ball'],
 'inchcountry': ['country', 'count', 'inch', 'try', 'in']}