我有一些带有一些字符的字符串,我正在寻找这些字符的组织,以便它是最可能的.
例如,如果我有字母"ascrlyo",那么有些安排会比其他安排更加明显.以下可能获得"高分":
可怕的
如果以下可能获得低分:
oascrly yrlcsoa
我可以使用一个简单的算法吗?或者更好的是,Python功能实现了这一目标?
谢谢!
首先解决一个更简单的问题:一个给定的单词是否可以发音?
机器学习"监督学习"在这里可能是有效的.在字典单词和加扰单词的训练集上训练二进制分类器(假设加扰的单词都是不可发音的).对于功能,我建议计算双字母和三元组.我的理由是:'tns'和'srh'等不可发音的三字卦在词典中很少见,尽管每个字母都是常见的.
我们的想法是,经过训练的算法将学习将具有任何罕见三元组的单词分类为不可发音的单词,并且将仅具有共同三元组的单词分类为可发音的单词.
这是scikit-learn http://scikit-learn.org/的实现
import random def scramble(s): return "".join(random.sample(s, len(s))) words = [w.strip() for w in open('/usr/share/dict/words') if w == w.lower()] scrambled = [scramble(w) for w in words] X = words+scrambled y = ['word']*len(words) + ['unpronounceable']*len(scrambled) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y) from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB text_clf = Pipeline([ ('vect', CountVectorizer(analyzer='char', ngram_range=(1, 3))), ('clf', MultinomialNB()) ]) text_clf = text_clf.fit(X_train, y_train) predicted = text_clf.predict(X_test) from sklearn import metrics print(metrics.classification_report(y_test, predicted))
它的准确率为92%.无论如何,鉴于可发性是主观的,这可能会得到它的好处.
precision recall f1-score support scrambled 0.93 0.91 0.92 52409 word 0.92 0.93 0.93 52934 avg / total 0.92 0.92 0.92 105343
它同意你的例子:
>>> text_clf.predict("scaroly crasoly oascrly yrlcsoa".split()) ['word', 'word', 'unpronounceable', 'unpronounceable']
对于好奇,这里有10个混乱的单词,它可以分类:
moro garapm ocenfir onerixoatteme arckinbo raetomoporyo bheral accrene cchmanie suroatipsheq
最后10个词典词被错误分类为不可启动的:
ilch tohubohu usnea halfpaced pyrostilpnite lynnhaven cruel enure moldproof piecemeal