この場合、単語セグメンテーションを使用したいと思うし、英語の文章をスペースなしで処理するNLTKの単語セグメンテーション機能は認識していません。代わりにpyenchant
を使用できます。私は次のコードを例として提供します。 (これは、あなたのサンプルリストの文字列のような、比較的短い文字列に対して適度な数の文字列に対してはうまくいくが、長い文字列やより多くの文字列に対しては非常に非効率的である。)修正が必要であり、いずれの場合も文字列。
import enchant # pip install pyenchant
eng_dict = enchant.Dict("en_US")
def segment_str(chars, exclude=None):
"""
Segment a string of chars using the pyenchant vocabulary.
Keeps longest possible words that account for all characters,
and returns list of segmented words.
:param chars: (str) The character string to segment.
:param exclude: (set) A set of string to exclude from consideration.
(These have been found previously to lead to dead ends.)
If an excluded word occurs later in the string, this
function will fail.
"""
words = []
if not chars.isalpha(): # don't check punctuation etc.; needs more work
return [chars]
if not exclude:
exclude = set()
working_chars = chars
while working_chars:
# iterate through segments of the chars starting with the longest segment possible
for i in range(len(working_chars), 1, -1):
segment = working_chars[:i]
if eng_dict.check(segment) and segment not in exclude:
words.append(segment)
working_chars = working_chars[i:]
break
else: # no matching segments were found
if words:
exclude.add(words[-1])
return segment_str(chars, exclude=exclude)
# let the user know a word was missing from the dictionary,
# but keep the word
print('"{chars}" not in dictionary (so just keeping as one segment)!'
.format(chars=chars))
return [chars]
# return a list of words based on the segmentation
return words
あなたが見ることができるように、このアプローチ(おそらく)誤セグメントあなたの文字列の唯一の1:
>>> t = ['usingvariousmolecularbiology', 'techniques', 'toproduce', 'genotypes', 'following', 'standardoperatingprocedures', '.', 'Operateandmaintainautomatedequipment', '.', 'Updatesampletrackingsystemsandprocess', 'documentation', 'toallowaccurate', 'monitoring', 'andrapid', 'progression', 'ofcasework']
>>> [segment(chars) for chars in t]
"genotypes" not in dictionary (so just keeping as one segment)
[['using', 'various', 'molecular', 'biology'], ['techniques'], ['to', 'produce'], ['genotypes'], ['following'], ['standard', 'operating', 'procedures'], ['.'], ['Operate', 'and', 'maintain', 'automated', 'equipment'], ['.'], ['Updates', 'ample', 'tracking', 'systems', 'and', 'process'], ['documentation'], ['to', 'allow', 'accurate'], ['monitoring'], ['and', 'rapid'], ['progression'], ['of', 'casework']]
あなたはその後、リストのリストを平らにするchain
を使用することができます。
>>> from itertools import chain
>>> list(chain.from_iterable(segment_str(chars) for chars in t))
"genotypes" not in dictionary (so just keeping as one segment)!
['using', 'various', 'molecular', 'biology', 'techniques', 'to', 'produce', 'genotypes', 'following', 'standard', 'operating', 'procedures', '.', 'Operate', 'and', 'maintain', 'automated', 'equipment', '.', 'Updates', 'ample', 'tracking', 'systems', 'and', 'process', 'documentation', 'to', 'allow', 'accurate', 'monitoring', 'and', 'rapid', 'progression', 'of', 'casework']
それは素晴らしいです、ありがとう!私が探していたのは驚異的なことです。私はこれがnltkコーパスでできると思っていましたが、焦燥癖に取り組んでうれしく思います! – Kookaburra
ちょっと、私はこの答えが一種だと知っていますが、あなたが試してみると、set()のデフォルトパラメータが疲れていると思います。 In [6]:segment_str( "tookapill ") Out [6]:['to'、 'okapi'、 'll'] In [7]:segment_str(" tookapillinibiza ") 辞書にないので(ただ1つのセグメントとして保存)、" tookapillinibiza "! Out [7]:['tookapillinibiza'] [8]:segment_str( "tookapill") 辞書にないので、 "takeapill"は1つのセグメントとして保持されます。 Out [8]:['tookapill'] ' デフォルトでNoneを追加し、使用時にチェックしました:http://effbot.org/zone/default-values.htm –