Python3 - 处理带连字符的单词:合并和拆分

时间:2018-03-27 07:52:08

标签: regex python-3.x replace split nlp

我想处理带连字符的单词。例如,我想以两种不同的方式处理“众所周知”这个词。

首先,结合这个词,即(“wellknown”),第二种方法是分割单词,即(“well”,“known”)。

输入将是:“众所周知”,预期输出为:

--wellknown

--well

--known

但我只能单独解析每个单词,但不能同时解析这两个单词。当我遍历我的文本文件时,如果我正在寻找带连字符的单词,我首先将它们组合在一起。

然后在我将它们组合后,我不知道如何再次回到原始单词并执行拆分操作。以下是我的代码中的简短部分。 (如果您需要了解更多详情,请告诉我)

for text in contents.split():   
   if not re.search(r'\d', text):               #remove numbers
      if text not in string.punctuation:        #remove punctuation
        if '-' in term:
           combine = text.replace("-", '')      #??problem parts (wellknown)
           separate = re.split(r'[^a-z]', text) #??problem parts (well, known)

我知道我不能同时做这两个操作的原因,因为在我替换了连字符后这个词就消失了。然后我找不到带连字符的单词来进行拆分(在代码中是“单独”)操作。有没有人知道怎么做?或者如何修复逻辑?

2 个答案:

答案 0 :(得分:2)

为什么不使用包含分隔的单词和组合单词的元组。

首先拆分然后合并:

示例代码

separate = text.split('-')
combined = ''.join(separate)
words = (combined, separate[0], separate[1])

<强>输出

('wellknown', 'well', 'known')

答案 1 :(得分:1)

将令牌更多地视为对象而不是字符串,然后您可以创建具有多个属性的令牌。

例如,我们可以使用collections.namedtuple容器作为一个简单的对象来保存令牌:

from collections import namedtuple

from nltk import word_tokenize

Token = namedtuple('Token', ['surface', 'splitup', 'combined'])

text = "This is a well-known example of a small-business grant of $123,456."

tokenized_text = []

for token in word_tokenize(text):
    if '-' in token:
        this_token = Token(token, tuple(token.split('-')),  token.replace('-', ''))
    else:
        this_token = Token(token, token, token)
    tokenized_text.append(this_token)

然后,您可以遍历tokenized_text作为Token namedtuple的列表,例如如果我们只需要表面字符串列表:

for token in tokenized_text:
    print(token.surface)
    tokenized_text

[OUT]:

This
is
a
well-known
example
of
a
small-business
grant
of
$
123,456
.

如果您需要访问组合令牌:

for token in tokenized_text:
    print(token.combined)

[OUT]:

This
is
a
wellknown
example
of
a
smallbusiness
grant
of
$
123,456
.

如果您想访问拆分令牌,请使用相同的循环,但您会看到您获得了一个元组而不是字符串,例如

for token in tokenized_text:
    print(token.splitup)

[OUT]:

This
is
a
('well', 'known')
example
of
a
('small', 'business')
grant
of
$
123,456
.

您也可以使用列表推导来访问Token namedtuples的属性,例如。

>>> [token.splitup for token in tokenized_text]
['This', 'is', 'a', ('well', 'known'), 'example', 'of', 'a', ('small', 'business'), 'grant', 'of', '$', '123,456', '.']

要识别带有连字符并已被拆分的令牌,您可以轻松检查其类型,例如

>>> [type(token.splitup) for token in tokenized_text]
[str, str, str, tuple, str, str, str, tuple, str, str, str, str, str]