从字符串中获取所有可能的英文单词
从http://pythonhosted.org/pyenchant/tutorial.html
>>> from nltk import everygrams
>>> import enchant
>>> word = 'godaddy'
>>> [''.join(_ngram) for _ngram in everygrams(word) if d.check(''.join(_ngram))]
['g', 'o', 'd', 'a', 'd', 'd', 'y', 'go', 'ad', 'god', 'dad', 'add', 'daddy']
>>> d = enchant.Dict("en_US")
# Exclude single char words.
>>> [''.join(_ngram) for _ngram in everygrams(word) if d.check(''.join(_ngram)) and len(_ngram) > 1]
['go', 'ad', 'god', 'dad', 'add', 'daddy']
尝试enchant
但如果它是字符串的所有组合,无论它是否是一个有效的英文单词:
>>> list(everygrams(word))
参见:
- n-grams in python, four, five, six grams?
- Generating Ngrams (Unigrams,Bigrams etc) from a large corpus of .txt files and their Frequency
- extracting n grams from huge text
- Fast/Optimize N-gram implementations in python
- How to compute skipgrams in python?
注
任何字典检查方法是有其局限性:
>>> from nltk.corpus import words as english
>>> vocab = set(w.lower() for w in english.words())
>>> "google" in vocab
False
>>> "*" in vocab
False
>>> import enchant
>>> d = enchant.Dict("en_US")
>>> d.check('*')
False
>>> d.check('*')
False
>>> d.check('Google')
True
的“原则性”的方式做这个任务是做语言建模的人物等级,并有一定概率的方法来检查的字符序列是否更/不太像英文单词。
此外,世界上还有很多英语。英式英语中的“有效”单词可能是美国英语中未知的单词。见http://www.ucl.ac.uk/english-usage/projects/ice.htm和https://en.wikipedia.org/wiki/World_Englishes#Classification_of_Englishes
首先,得到一组所有英文单词。我期望有很多库可以做到这一点,但是对于软件库的建议与Stack Overflow无关,所以只需使用你能找到的任何东西。
然后遍历字符串的所有子字符串,看看它们中的任何一个是否在集合中。
words = #???
s = "godaddy"
for i in range(len(s)):
for j in range(i+1, len(s)):
substring = s[i:j+1]
if substring in words:
print(substring)
结果:
go
god
od
oda
da
dad
daddy
ad
add
执行时间很大。 –
您可以使用nltk.corpus.words
创建一组的所有英语单词,然后找到的从你的字符串与英文单词生成的所有可能的字的交叉点:
In [56]: all_words = {st[i:j + i] for j in range(2, len(st)) for i in range(len(st)- j + 1)}
In [57]: english_vocab = set(w.lower() for w in nltk.corpus.words.words())
In [58]: english_vocab.intersection(all_words)
Out[58]: {'ad', 'add', 'addy', 'da', 'dad', 'daddy', 'go', 'god', 'od', 'oda'}
注意的话像OD
或oda
是有效的缩写。
好的。谢谢。 –
在我看来,你想使用*特里*(不要与*树*混淆)。 –