是否有一个好的库可以检测并拆分组合字符串中的单词?
示例:
"cdimage" -> ["cd", "image"]
"filesaveas" -> ["file", "save", "as"]
答案 0 :(得分:11)
这是一个动态编程解决方案(作为memoized函数实现)。给定具有其频率的单词字典,它将输入文本分割为给出总体最可能短语的位置。你必须找到一个真正的单词列表,但我为一个简单的测试包含了一些组合频率。
WORD_FREQUENCIES = {
'file': 0.00123,
'files': 0.00124,
'save': 0.002,
'ave': 0.00001,
'as': 0.00555
}
def split_text(text, word_frequencies, cache):
if text in cache:
return cache[text]
if not text:
return 1, []
best_freq, best_split = 0, []
for i in xrange(1, len(text) + 1):
word, remainder = text[:i], text[i:]
freq = word_frequencies.get(word, None)
if freq:
remainder_freq, remainder = split_text(
remainder, word_frequencies, cache)
freq *= remainder_freq
if freq > best_freq:
best_freq = freq
best_split = [word] + remainder
cache[text] = (best_freq, best_split)
return cache[text]
print split_text('filesaveas', WORD_FREQUENCIES, {})
--> (1.3653e-08, ['file', 'save', 'as'])
答案 1 :(得分:8)
我不知道它的任何库,但实现基本功能应该不难。
words
。示例:
答案 2 :(得分:3)
让人们在您的网站上将其解析为验证码:)
答案 3 :(得分:2)
我不知道这样做的库,但如果你有一个单词列表,写起来并不难:
wordList = file('words.txt','r').read().split()
words = set( s.lower() for s in wordList )
def splitString(s):
found = []
def rec(stringLeft, wordsSoFar):
if not stringLeft:
found.append(wordsSoFar)
for pos in xrange(1, len(stringLeft)+1):
if stringLeft[:pos] in words:
rec(stringLeft[pos:], wordsSoFar + [stringLeft[:pos]])
rec(s.lower(), [])
return found
这将返回将字符串拆分为给定单词的所有可能方法。
示例:
>>> splitString('filesaveas')
[['file', 'save', 'as'], ['files', 'ave', 'as']]
答案 4 :(得分:2)
可以看到这个例子:但是它是用scala编写的。 当句子之间没有空格时,这可以拆分您想要的任何内容。
答案 5 :(得分:-1)
如果你不是为了好玩而做这件事,但实际上是在为工作做些什么,我的建议是从源头上解决这个问题。为什么你把这些字符串组合起来呢?你从哪里得到那些琴弦?如果可能的话,在这些字符串的来源处插入空格。
答案 6 :(得分:-1)
我知道这个问题是针对Python标记的,但我需要一个JavaScript实现。离开之前的答案,我想我会分享我的代码。似乎工作得体。
function findWords(input){
input = input.toLowerCase().replace(/\s/g, ""); //Strip whitespace
var index = 0;
var validWords = [];
for (var len = input.length; len > 0; len--){ //Go backwards as to favor longer words
var testWord = input.substr(index, len);
var dictIndex = _dictionary.indexOf(testWord.replace(/[^a-z\']/g, "")); //Remove non-letters
if (dictIndex != -1){
validWords.push(testWord);
if (len == input.length){
break; //We are complete
}
var nextWords = findWords(input.substr(len, input.length - len)); //Recurse
if (!nextWords.words.length){ //No further valid words
validWords.pop();
}
validWords = validWords.concat(nextWords.words);
if (nextWords.complete === true){
break; //Cascade complete
}
}
}
return {
complete:len > 0, //We broke which indicates completion
words:validWords
};
}
注意:" _dictionary"预计是按频率排序的单词数组。我正在使用Project Gutenberg的词汇表。