识别并提取名词和修饰语

时间:2016-02-02 10:19:38

标签: excel vba

知道如何使用 VBA(excel)识别和提取名词和修饰符

示例:

球阀2in用于带垫圈的绿色泵

应该是: 球阀

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

根据您期望的句子类型,有一些不同的方法。在您的示例中,您要提取的两个单词位于句子的开头,并以空格分隔。如果您希望始终如此,那么您可以使用简单的

Function getNoun(ByVal sentence As String)
    getNoun = ""
    pos1 = InStr(1, sentence, " ") 'find the first whitespace
    If pos1 <= 0 Then
        getNoun = sentence 'if no whitespace, then assume there is only the noun
        Exit Function
    End If
    pos2 = InStr(pos1 + 1, sentence, " ") 'find the second whitespace
    If pos2 <= 0 Then
        getNoun = sentence 'if no second whitespace, then assume there is only the noun and qualifier
        Exit Function
    End If

    getNoun = Left(sentence, pos2 - 1) 'if there are two or more spaces, get all chars before the second one
End Function

立即测试窗口:

? getNoun("ball valve 2in for green pump with gasket")
ball valve
? getNoun("ball valve")
ball valve
? getNoun("ball")
ball

如果您的场景更复杂,并且您需要使用特定标准来确定哪些单词是所需的名词和限定符,您可能会找到用于Regex COM类的内容(例如,请参阅this topic)。

编辑:根据评论,我理解职位是可变的,并且可以使用MS Word同义词作为参考。如果代码将在Microsoft Word中运行,则以下函数将告诉您单词是否为名词:

 Function is_noun(ByVal wrd As String)
  Dim s As Object, l As Variant
  is_noun = False
  Set s = SynonymInfo(wrd)
  Let l = s.PartOfSpeechList
  If s.MeaningCount <> 0 Then
      For i = LBound(l) To UBound(l)
          If l(i) = wdNoun Then
              is_noun = True
          End If
      Next
  End If
End Function

如果您没有在MS Word上运行(您的标签建议使用MS Excel)但在目标系统中安装了MS Word,那么您可以调整上述代码以使用MS Word COM自动化对象。

然后你可以从一个句子中提取第一个名词和下一个词 - 如果有的话 - 用这样的东西

Function getNoun(ByVal sentence As String)
   getNoun = ""
   Dim wrds() As String
   wrds = Split(sentence)
   For i = LBound(wrds) To UBound(wrds)
        If is_noun(wrds(i)) Then
            getNoun = wrds(i)
            If i < UBound(wrds) Then
                getNoun = getNoun & " " & wrds(i + 1)
            End If
            Exit Function
        End If
    Next
End Function

但请注意,如果您的句子包含,例如,根据上下文可能是动词或名词的单词,那么您可能会盲目地信任MS Word的单词数据库。此外,上面的示例将使用您的MS Word设置的默认语言(可以使用另一个 - 如果已安装 - 通过在SynonymInfo中包含语言参数)